使用Excel互操作设置单元格的值

23

好的,我正在尝试使用Excel Interop库设置单元格的值。我能够使用以下方法完成:

sheet.Cells[row, col] = value;

但是对于我设置的数量来说,它非常慢。因此,我正在尝试走这条路:

Range excelRange = sheet.UsedRange;
excelRange.Cells.set_Item(row, col, value);

代码可以执行,但是单元格中没有数据。你有什么建议或者我漏掉了什么?谢谢!


我们谈论的是多少个单元格? - Tyler Treat
1
“value”有价值吗?“value”的类型正确,可以适应单元格吗? - Tomas Voracek
4个回答

25

您的第一种方法应该对任何合理(和很多不合理)数量的单元格都可以正常工作,只要您已禁用屏幕更新 (Application.ScreenUpdating = false)。描述如何使用C#设置单元格的知识库文章也按行和列进行访问。


22

你尝试过一次性设置所有值,而不是遍历数组并逐个设置单元格吗?这样你只需要一次通过COM边界传递数据,而不是每个单元格都要传递一次。

在这方面,Excel非常灵活。请尝试以下操作:

int[] intArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range rng = excelApp.get_Range("A1", "J1");
rng.Value = intArray; 

你应该对每个要设置的单元格进行迭代的方式进行改进,以使其更快。

除此之外,正如Andy所建议的那样,关闭屏幕更新,并考虑在完成复制过程之前将计算方式设置为手动。


嗯,我尝试了这个方法,它有效了,但是有几个单元格跨越了行并且它没有正确地展示值。我正在使用对象数组,因为数据是混合的,有些是小数,有些是字符串。 - Arthurdent510
5
您可以使用多维数组填充数据范围。 - Jon Peterson
嗯,这对我不起作用。我正在将 object[] 分配给 range.Value,并且所有单元格都获得了数组第一个项目的值。请帮忙。 - Mr. TA
2
搞定了!当填充由多行组成的范围时,必须使用二维数组。Excel Interop不会自动按行拆分常规(一维)数组。 - Mr. TA

2

这是一个简单的解决方案,但您需要在NuGet控制台中写入以下命令来安装Microsoft.Office.Interop.Excel包:

Install-Package Microsoft.Office.Interop.Excel

   //test excel file
   Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

        Workbook workbook = excel.Workbooks.Open(System.Windows.Forms.Application.StartupPath + "/TrainedFaces/AttendanceLog.xlsx", ReadOnly: false, Editable: true);
        Worksheet worksheet = workbook.Worksheets.Item[1] as Worksheet;
        if (worksheet == null)
            return;

        var abc = worksheet.Cells[2, 1].Value;
        Range row1 = worksheet.Rows.Cells[1, 1];
        Range row2 = worksheet.Rows.Cells[2, 1];

        row1.Value = "Test100";
        row2.Value = "Test200";


        excel.Application.ActiveWorkbook.Save();
        excel.Application.Quit();
        excel.Quit();

-8

请尝试

[excelWorksheet].Cells[1, 1] = "[String you want]";

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