Tag: excel interop

从Excel中设置单元格样式从C#行为不当

下面的代码片段是一个函数,它接受一个矩形的stringmatrix和一个写xls文件的path。 它将matrix的内容放入Excel工作表的单元格中,并根据内容应用一些格式: public static void WriteXL(string[,] matrix, string path) { XL.Application app = new XL.Application(); XL.Workbook wbk = app.Workbooks.Add(); XL.Worksheet wsht = wbk.Worksheets.Add(); for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { int _i = i + 1; int _j = j + 1; […]

来自HRESULT的exception:0x8002000B(DISP_E_BADINDEX)for System.Runtime.InteropServices.COMException

我有一部分代码试图将数据(从数据库)导出到Excel。 当我尝试执行此任务时,它正在生成此错误: System.Runtime.InteropServices.COMException occurred Additional information: Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX)) 产生这个错误的代码是: string ExcelFileName = RootFolder + "\\" + "Work_Sheet.xls"; File.Copy(RootFolder + "\\" + "WorksOrder_Template.xls", ExcelFileName); Excel.Workbook xlWorkBook; xlWorkBook = excelApp.Workbooks.Open(ExcelFileName, 0, false, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, false, true, Type.Missing); Excel.Worksheet Page2; Excel.Worksheet Page3; Page2 = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item("Sheet2"); Page3 […]

您可以使用Excel Interop W / o使用剪贴板粘贴一个单元格块吗?

我试图从DataSet传输数据到Excel工作簿。 不幸的是,我需要更多的控制,比通过ADO.NET简单地链接到Excel,并使用标准的SQL来select和插入数据,所以我使用的是互操作。 我原来的algorithm是循环遍历数据集的所有表格/行/项目,并在Excel中单独设置每个单元格的Formula 。 这工作,但转移所有的数据花了差不多半分钟。 我决定尝试一个不同的解决scheme:将每个表转换为制表符分隔的string(使用StringBuilder和string.Join()的组合,将该string复制到剪贴板,并使用interop调用Excel Worksheet对象上的粘贴命令。 这也可以使时间缩短50%以上,但是我对使用剪贴板传输数据有点偏执。 如果用户在传输过程中开始执行涉及剪贴板的其他操作,会发生什么情况? 我还想知道,如果我可以直接粘贴一个string,而不是使用剪贴板作为媒介,速度会更快。 所以,这是我的问题… 是否有一些命令可以让我直接从C#string在Excel中“粘贴”一块数据,而无需使用剪贴板?

打开Excel工作簿文件使用embedded式资源

我正在使用Microsoft Office Interop来打开Excel文件。 该文件放置在工作簿代码读取文件的特定文件夹中。 现在,要求是Excel文件可以放在任何地方。 我相信最好的办法是将Excel文件作为embedded式资源。 但是,如果我作为embedded式资源附加,我将如何使用Excel工作簿读取文件。 _excelapplication.Workbooks.Open(Filename: pExcelTemplatePath); 无论文件位置如何,读取excel模板文件的最佳方法是什么?

C#正确方法closures多个Excel对象与Excel进程销毁

我有一个C#控制台程序。 运行时,它实例化一些Excel对象,如:(openExcelO)。 当程序运行完毕,我有一个方法closuresExcel(closeExcel),并且应该正确清理Excel进程。 在任务pipe理器中,我可以看到剩下的Excel剩余部分。 closures例程是从互联网的例子拼凑在一起: private void openExcelO (string dir) { try { xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open(dir + "PortfolioOptimization5.xlsm", 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlMarkowitz = (Excel.Worksheet)xlWorkBook.Sheets["Markowitz"]; xlWeights = (Excel.Worksheet)xlWorkBook.Sheets["Weights"]; } catch (Exception ex) { ReportError("PortfolioOptimization", "openExcel", ex.ToString()); } } private void closeExcel […]

如何在c#中使用MS interop excel来检测合并的单元格

我想要检测合并单元格在一行/整个表(最好)。这里是我的代码 Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workbook = xl.Workbooks.Open(source); //Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[sheetNumber]; Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[objInMemory._sheetName]; xl.ScreenUpdating = false; ws.Columns.ClearFormats(); ws.Rows.ClearFormats(); int colCount = ws.UsedRange.Columns.Count; int rowCount = ws.UsedRange.Rows.Count; int strtRow = ws.UsedRange.Rows[1].Row; int strtCol = ws.UsedRange.Columns[1].Column; Microsoft.Office.Interop.Excel.Range objRange = null; 这段代码也没有 if (ws.Cells.MergeCells) { } 也不是这段代码(仅适用于row1) for (int j = strtCol; j […]

C#Excel范围pipe理

我正在处理C#应用程序中的excel文件。 我想知道为什么这个代码不起作用: var value1 = ws.Range[ws.Cells[7,4]].Value; 现在我发现这工作正常: int i = 7; var value1 = ws.Range["D" + i.ToString()].Value;

将Excel图表导出为图像

我已经编写了以下简单的C#控制台应用程序,从Excel工作簿中导出所有图表。 它工作得很好, 除非图表没有被滚动到打开文档之后 ,在这种情况下会生成一个空的图像文件。 using Excel = Microsoft.Office.Interop.Excel; using System; using System.Diagnostics; namespace ExcelExporter { class ChartExporter { const string EXPORT_TO_DIRECTORY = @"C:\Users\Sandy\Desktop\Excel\Charts"; static void Main(string[] args) { Excel.Application app = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Microsoft.Office.Interop.Excel.Application; ConsoleColor c = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Green; Console.Write("Export To: "); Console.ForegroundColor = c; string exportPath = Console.ReadLine(); if (exportPath == "") […]

Excel Interop着色单元格使用范围

我需要以快速的方式对Excel单元格进行着色。 我发现类似的方法写入Excel单元格对我来说真的很快,所以我尝试着色单元格时应用相同的方法。 考虑下面的代码: xlRange = xlWorksheet.Range["A6", "AS" + dtSchedule.Rows.Count]; double[,] colorData = new double[dtSchedule.Rows.Count, dtSchedule.Columns.Count]; for (var row = 0; row < dtSchedule.Rows.Count; row++) { for (var column = 0; column < dtSchedule.Columns.Count; column++) { if (column <= 3) { colorData[row, column] = GetLightColor2("#ffffff"); continue; } if (dtSchedule.Rows[row][column].ToString() != "#000000" && !string.IsNullOrEmpty(dtSchedule.Rows[row][column].ToString())) { string[] schedule […]

Excel中的文本部分颜色> 255个字符

我已经为第三方sw编写了一个插件,它可以将修改后的文本提取到Excel工作表中,然后在Excel中着色更改的部分。 只要每个文本段(=单元格内容)不超过255个字符,这都是有效的。 唉,这可以,偶尔也会发生。 为了在Excel中识别已更改的部分,我用<del>和res。 用于删除和添加文本的<add>标签。 然后我为这些部分着色(并删除周围的标签),如下所示: while (((string)cell1.Text).Contains("<del>")) { try { var pos = ((string) cell1.Text).IndexOf("<del>") + 1; var pos2 = ((string) cell1.Text).IndexOf("</del>") + 1; var txt = cell1.Characters[pos, (pos2-pos) + 9].Text; txt = txt.Replace("<del>", "").Replace("</del>", ""); cell1.Characters[pos, (pos2-pos) + 9].Text = txt; cell1.Characters[pos, txt.Length-3].Font.Color = -16776961; } catch { break; } } 我正在使用Interop,因为我觉得使用起来要容易得多,而且因为找不到像OpenXML这样的例子。 但是我意识到Excel在单元格文本方面有其局限性,所以我愿意提供build议。 […]