复制Excel工作簿中的第一行到新的Excel工作簿。

5

如何使用 .net c# 获取 Excel 工作簿中的第一行并将其保存到新的 Excel 工作簿中?由于不知道有多少列,因此需要获取整行数据。以下是我的代码,但新工作簿为空(没有复制行)。

Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(file);    
Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];    
Excel.Range xlRangeHeader = xlWorksheet.get_Range("A1", "A1").EntireRow;                         
Excel.Workbook xlWorkbookNew = xlApp.Workbooks.Add();    
Excel._Worksheet xlWorksheetNew = xlWorkbookNew.Sheets[1];    
xlWorksheetNew.get_Range("A1", "A1").EntireRow.Value = xlRangeHeader;                        
xlWorkbook.Close(false);                        
xlWorkbookNew.SaveAs(Path.Combine(sDestination, Path.GetFileName(file)), fileFormat);                        
xlWorkbookNew.Close(true);
2个回答

3

试试这段代码:

xlWorksheetNew.get_Range("A1", "A1").EntireRow.Value = xlRangeHeader.Value;        

或者

xlWorksheetNew.get_Range("A1", "A1").EntireRow.Value = xlWorksheet.get_Range("A1", "A1").EntireRow.Value;

1
啊,我试过使用.value,但是我的范围不对,我从未尝试过使用正确的范围格式。谢谢。顶部行有效。 - GisborneDevops

2
public void test(Application xlApp)
{
    string file = @"C:\Temp\a.xlsx";
    Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(file);
    Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
    xlWorksheet.Range["A1"].EntireRow.Copy(); 
    Excel.Workbook xlWorkbookNew = xlApp.Workbooks.Add();
    Excel._Worksheet xlWorksheetNew = xlWorkbookNew.Sheets[1];
    Worksheet activeSheet = xlWorkbookNew.ActiveSheet;
    activeSheet.Paste();

    xlWorkbook.Close(false);
    xlWorkbookNew.SaveAs(Path.Combine(@"C:\Temp", Path.GetFileName(file)));
    xlWorkbookNew.Close(true);
    CloseExcel();
}

public void CloseExcel(Application xlApp)
{
    try
    {
        if (xlApp != null)
        {
            xlApp.Quit();
            if (Marshal.IsComObject(xlApp))
                Marshal.ReleaseComObject(xlApp);
        }
    }
    catch (Exception ex)
    {
    }
}

编辑:

我原本想讲一些底层的东西,但不知道你的专业水平。如果你想要良好的性能,请勿使用复制/粘贴。这里我将向你展示一些性能技巧。首先,一次性写入所有单元格:

object[,] values = (object[,])Array.CreateInstance(typeof(object), new int[2] { rowCount, ColumnCount }, new int[2] { 1, 1 });

//在这里填写值,然后一次性将数据写入Excel:

using (var targetRange = xlApp.Range[topLeft + startRow + ":" + rightBottom + endRow].WithComCleanup())
{
   targetRange.Resource.Value2 = values;
}

其次,注意 .WithComCleanup() - 在进行 VSTO 编程时,您需要注意管理非托管内存 - 参见 http://jake.ginnivan.net/vsto-com-interop


当循环大量电子表格时,复制操作的性能如何?我试图避免使用剪贴板代码,因为我将要循环遍历一堆Excel文件。 - GisborneDevops
谢谢Jeremy,我现在的代码怎么集成这个性能技巧呢?谢谢。Tony。 - GisborneDevops
只需下载VSTOContrib.Core.DLL和VSTOContrib.Excel.DLL并在您的项目中引用它们。要填充object[,],请使用两个从1开始的for循环,因为Excel是Base 1。 - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接