Tag: 互操作

如何将一个Excel工作表从一个工作簿复制到另一个?

我有一个需要将工作表从一个工作簿复制到另一个工作表,我有点卡住了。 前提是我有一个“主”工作簿,用于存储多个报表的模板,然后需要创build特定工作表的空白副本并将其添加到新的工作簿中。 这是我迄今为止: private void CreateNewWorkbook(Tables table) { Excel.Application app = null; Excel.Workbook book = null; Excel.Worksheet sheet = null; try { string startPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); string filePath = System.IO.Path.Combine(startPath, "sal1011forms.xls"); Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); app = new Excel.Application(); book = app.Workbooks.Open(filePath); sheet = (Excel.Worksheet)book.Worksheets.get_Item((int)table + 1); sfd.AddExtension = true; sfd.FileName = table.ToString() + […]

以编程方式(C#)将Excel转换为图像

我想通过编程(c#)将Excel文件转换为图像(每种格式都可以)。 目前,我正在使用Microsoft Interop Libraries&Office 2007,但默认情况下不支持保存图像。 所以我目前的解决方法如下: 使用Microsoft Interop打开Excel文件; 找出最大范围(包含数据); 使用该范围的CopyPicture(),将复制数据到剪贴板。 现在棘手的部分(和我的问题): 问题1: 使用.NET剪贴板类,我不能从剪贴板中得到正确的复制数据:数据是相同的,但不知何故格式化是扭曲的(整个文件的字体似乎变得粗体和一点点当他们不是可读的时候); 如果我使用mspaint.exe从剪贴板粘贴,粘贴的图像是正确的(就像我想要的那样)。 我反汇编mspaint.exe,并发现它正在使用(OleGetClipboard)从剪贴板中获取数据的函数,但我似乎无法得到它在C#/ .NET中的工作。 我尝试的其他事情是剪贴板WINAPI(OpenClipboard,GetClipboardData,CF_ENHMETAFILE),但结果与使用.NET版本相同。 问题2: 使用范围和CopyPicture,如果Excel表格中有任何图像,这些图像不会与周围的数据一起复制到剪贴板。 一些源代码 Excel.Application app = new Excel.Application(); app.Visible = app.ScreenUpdating = app.DisplayAlerts = false; app.CopyObjectsWithCells = true; app.CutCopyMode = Excel.XlCutCopyMode.xlCopy; app.DisplayClipboardWindow = false; try { Excel.Workbooks workbooks = null; Excel.Workbook book = null; Excel.Sheets sheets = null; […]

C#和Excel互操作

我的一个用户在尝试通过我的C#应用​​程序打开一个Excel文件时遇到了问题。 当我从我的机器上运行它,一切工作正常,它适用于其他用户。 我不是Excel互操作专家,所以希望你们能帮助我。 这是如何设置的: 我添加了一个对我的应用程序的引用Microsoft.Office.Interop.Excel.dll,版本10.0.4504.0(我相信是Excel 2002)。 在我的机器上,我安装了Excel 2007.在我的代码中,我尝试打开一个工作表,如下所示: using Microsoft.Office.Interop … Microsoft.Office.Interop.Excel.ApplicationClass _excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); Microsoft.Office.Interop.Excel.Workbook excelWorkbook = _excelApp.Workbooks.Open(workbookPath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", false, false, 0, true, false, false); Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets; Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(1); 我将用户版本logging为Excel 9.0(即2000)。 用户得到的错误是: Exception='System.AccessViolationException: Attempted to read or write protected memory. This is […]

C#Excel自动化导致Excel内存泄漏

我正在尝试使用C#与COM互操作库打开一套非常沉重的Excel工作簿。 我必须使用C#,因为我还需要启动macros,移动一些单元格,并开始一个自定义的Excel加载项,我的公司使用。 然后我的程序退出,将工作簿打开,每个都在一个单独的excel实例中。 当程序退出时,我不希望工作簿被closures。 问题是,当我的C#程序退出,随着时间的推移,Excel工作簿逐渐消耗更多的内存,直到他们从原来的500 MB内存消耗3.5演唱会的内存。 我曾经手工打开工作簿,工作表从未消耗过多的内存。 一旦我开始使用C#打开它们,由于内存使用量过大,它们开始中断。 我的理论是,当我与COM Excel对象交互时,我创build了一个内存泄漏。 以下是我的原始代码: using Excel = Microsoft.Office.Interop.Excel; … excelApp = new Excel.Application(); excelApp.Visible = true; excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue, true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue); excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic; 我阅读了关于如何使用Marshal来释放使用的信息,所以现在我正在尝试下面的代码,但是除了打开所有的表格并且看看它们是否消耗了太多的数据之外,没有简单的方法来testing它。 excelApp = new Excel.Application(); excelApp.Visible = true; Excel.Workbooks currWorkbooks = excelApp.Workbooks; Excel.Workbook currWorkbook […]

两台不同计算机上的不同Interop参考不起作用

当我在计算机上添加对Microsoft.Office.Interop.Excel的引用时,Visual Studio将其添加到项目文件中: <COMReference Include="Excel"> <Guid>{00020813-0000-0000-C000-000000000046}</Guid> <VersionMajor>1</VersionMajor> <VersionMinor>5</VersionMinor> <Lcid>0</Lcid> <WrapperTool>primary</WrapperTool> <Isolated>False</Isolated> </COMReference> 团队中还有另外一名开发人员遇到错误,需要将一个DLL文件添加到名为Interop.Excel.dll的项目中,该项目将在项目文件中用以下代码replace上面的代码: <Reference Include="Interop.Excel, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>My Project\Interop.Excel.dll</HintPath> </Reference> 这在我的电脑上工作。 你能解释一下这两种方法之间的区别,哪一个最好,以及如何让其他电脑上的第一个工作?

如何获得使用范围内的整个列?

我想获得一列,但限制它使用范围… public static Excel.Application App = new Excel.Application(); public static Excel.Workbook WB; WB = App.Workbooks.Open("xxx.xls", ReadOnly: true); var sheet = (WB.Sheets[1] as Excel.Worksheet); // returns 65536 rows, I want only 82 (used range) sheet.get_Range("F:F"); sheet.UsedRange.get_Range("F:F").Rows.Count; // 65536 我怎么才能得到它?

Excel Interop – 绘制范围内的所有边界

我从Microsoft的文档中看到,我可以使用“xlBordersIndex”属性访问单元格的特定边界边界,例如,为单元格的左边缘设置边框样式: range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous; 但是如果我只想画出所有的边界呢? 我努力了 range.BorderAround2(); 但这只是在范围本身附近画一个盒子,据我所知。 所以然后我试了 range.Cells.BorderAround2(); 认为它会通过范围内的每个单元格,并将每个单元格周围的所有边界。 这不是发生了什么。 因此,为了获得一个范围内的所有单元格的所有边界,我必须手动访问四个边界索引中的每一个?

如何加快将DataTable转储到Excel工作表?

我有以下例程将DataTable转储到Excel工作表中。 private void RenderDataTableOnXlSheet(DataTable dt, Excel.Worksheet xlWk, string [] columnNames, string [] fieldNames) { // render the column names (eg headers) for (int i = 0; i < columnNames.Length; i++) xlWk.Cells[1, i + 1] = columnNames[i]; // render the data for (int i = 0; i < fieldNames.Length; i++) { for (int j = 0; […]

使用Interop打印Excel

有没有人有任何想法如何使用C#和Excel Interop编程方式打印Excel文件? 如果是这样,你能提供代码吗?

服务器执行失败(HRESULTexception:0x80080005(CO_E_SERVER_EXEC_FAILURE))

我正在尝试使用Microsoft.Office.Interop.Excel.Workbook类将.xls文件转换为服务器端上的.xlsx文件,如下所示: workBook.SaveAs("FILENAME_HERE", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 我得到以下错误: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). : System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to […]