标签: excel-interop

将Excel文件从ASP.NET应用程序上载到MySQL时出错

我正在使用MySQL数据库处理Web应用程序(ASP.NET).当我尝试通过此应用程序上传Excel文件(.xlsx)时,我没有任何问题.当文件超过24904条记录时,问题就开始了.

那时我得到以下错误:

此表包含超出此电子表格中定义的单元格范围的单元格.

它写下了第一批24904条记录.

我试图以多个批次分割负载,但它不起作用.

有什么想法吗?

Dim connExcel As New System.Data.OleDb.OleDbConnection(conStr)
Dim cmdExcel As New System.Data.OleDb.OleDbCommand()
Dim dt As New DataTable()
Dim dataset As New DataSet
Dim x As Integer = 2
Dim y As Integer = 20001
Dim range As String = "A" + x.ToString + ":" + "I" + y.ToString

cmdExcel.Connection = connExcel

If erro = 0 Then
    Try

        For i As Integer = 0 To 50
            connExcel.Open()

            dataset.Reset()
            dataset.Clear()

            Dim oda …
Run Code Online (Sandbox Code Playgroud)

mysql vb.net asp.net excel-interop

15
推荐指数
1
解决办法
741
查看次数

使用Excel Interop删除空行

我有用户提供的需要转换为PDF的excel文件.使用excel互操作,我可以做到这一点.ExportAsFixedFormat().当工作簿有数百万行时,我的问题出现了.这将变成一个有50k +页面的文件.如果工作簿在所有这些行中都有内容,那就没问题.每次出现其中一个文件时,可能有50行有内容,其余的都是空白.我怎样才能删除空行,以便将其导出为合适大小的PDF?

  1. 我已经尝试从最后一行开始,一个接一个,CountA用来检查行是否有内容,如果有,则删除它.这不仅需要永远,这似乎在大约100k行后失败,并出现以下错误:

    无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上.

  2. 我尝试过使用SpecialCells(XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues)但如果任何单元格有格式(如bg颜色),则包含一行.

  3. 我尝试过使用Worksheet.UsedRange然后删除所有内容,但UsedRange与第二点有同样的问题.


这是我试过的代码:

for (int i = 0; i < worksheets.Count; i++)
{
    sheet = worksheets[i + 1];
    rows = sheet.Rows;
    currentRowIndex = rows.Count;
    bool contentFound = false;

    while (!contentFound && currentRowIndex > 0)
    {
        currentRow = rows[currentRowIndex];

        if (Application.WorksheetFunction.CountA(currentRow) == 0)
        {
            currentRow.Delete();
        }
        else
        {
            contentFound = true;
        }

        Marshal.FinalReleaseComObject(currentRow);
        currentRowIndex--;
    }

    Marshal.FinalReleaseComObject(rows);
    Marshal.FinalReleaseComObject(sheet);
}
Run Code Online (Sandbox Code Playgroud)
for (int i = 0; i < worksheets.Count; …
Run Code Online (Sandbox Code Playgroud)

c# office-interop excel-interop

14
推荐指数
1
解决办法
1万
查看次数

在C#中安全地处理Excel互操作对象?

我正在开发一个winforms c#visual studio 2008应用程序.该应用程序与excel文件对话,我正在使用Microsoft.Office.Interop.Excel;这个.

我想知道即使出现错误,如何确保对象被释放?

这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    string myBigFile="";
    OpenFileDialog openFileDialog1 = new OpenFileDialog();
    DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
    if (result == DialogResult.OK) // Test result.
        myBigFile=openFileDialog1.FileName;

    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    Excel.Range range;

    string str;
    int rCnt = 0;
    int cCnt = 0;

    xlApp = new Excel.ApplicationClass();
    xlWorkBook = xlApp.Workbooks.Open(myBigFile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", true, false, 0, true, 1, 0);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); …
Run Code Online (Sandbox Code Playgroud)

c# excel interop dispose excel-interop

14
推荐指数
1
解决办法
2万
查看次数

为什么Microsoft.Office.Interop.Excel.Application.Quit()会让后台进程运行?

以下代码将运行Microsoft Excel后台进程,直到我的程序退出为止:

var excelApplication = new Application();
var workbooks = excelApplication.Workbooks;
var workbook = excelApplication.Workbooks.Open(file.FullName);

workbook.Close();
excelApplication.Workbooks.Close();
excelApplication.Quit();

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApplication);
Run Code Online (Sandbox Code Playgroud)

为什么?我错过了什么?

c# excel office-interop excel-interop

14
推荐指数
3
解决办法
2万
查看次数

如何使用C#将自定义XML添加到打开的Excel 2007工作簿?

我正在尝试使用C#将自定义XML添加到打开的Excel 2007工作簿中.我使用Microsoft.Office.Interop.Excel作为接口.我发现有一个CustomXMLPart类,但我无法弄清楚如何使用它.最初我希望代码简单如下:

CustomXMLPart myXMLPart = new CustomXMLPart(xmlString);

myWorkBook.XMLCustomParts.Add(myXMLPart);

但这并不接近工作.

我尝试过在线查找示例,但是他们在讨论Packages,Addins,OpenXML,VSTO流等时非常复杂.我已经解压缩了一个合适的工作簿(xlsx)并发现它有docProps/custom.xml元素.

我只是想在保存之前将类似的custom.xml添加到新工作簿(2007).这可能吗?请注意我无法安装任何其他软件包或库.

编辑:我在调查此问题方面取得了一些进展.我相信我有正确的Office引用(COM下的Microsoft Office 12.0对象库)和Excel互操作引用(GAC下的Microsoft.Office.Interop.Excel).

声明

Microsoft.Office.Core.CustomXMLParts myCustomXMLParts;
Run Code Online (Sandbox Code Playgroud)

然而,编译

Microsoft.Office.Core.CustomXMLParts myCustomXMLParts =
    Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts;
Run Code Online (Sandbox Code Playgroud)

导致错误消息:错误CS0029:无法将类型"Microsoft.Office.Core.CustomXMLParts"隐式转换为"Microsoft.Office.Core.CustomXMLParts".

当我将鼠标悬停在Excel CustomXMLParts属性上时,它声称返回一个CustomXMLParts对象,在某种意义上,它是一个Microsoft.Office.Core.CustomXMLParts对象,但与Office程序集中的对象不完全相同.所以这里显然有一些不相容但我无法解决它.我安装了Microsoft Office Professional Plus 2007(12.0.6612.1000)和Office 2007主互操作程序集(12.0.4518.1014).

编辑:我很确定这是Office DLL的问题.在添加 - 引用上我看到"Microsoft Office 12.0对象库",可以添加它没有任何错误.它似乎只是参考文献下的"办公室".但是,它似乎对编译器不可见,同时仍然声称Microsoft.Office.Core是在未引用的程序集中定义的,并指定程序集'office',Version = 12.0.0.0.

我的Office引用链接到Microsoft Shared/OFFICE12下的MSO.DLL,并在Properties下有Major Version 2 Minor Version 4.这有关系吗?或者是错误消息只是表明由于某种原因它没有处理这个引用?

编辑:添加COM对象"Microsoft Office 12.0对象库"似乎肯定是问题.从其他论坛帖子我发现其他人看到"Microsoft.Office.Core"的引用出现,但我只看到"Office".我已经尝试直接编辑.csproj文件,这确实给了"Microsoft.Office.Core",但它仍然无法正常工作.我能真正得出的唯一结论是我的Office 12 Professional Plus的MSO.DLL(版本(12.0.6612.1000)实际上并不包含Microsoft.Office.Core程序集,或者无论如何都不会正确地公开它们.

c# xml excel excel-2007 excel-interop

14
推荐指数
1
解决办法
1573
查看次数

使用所有单元格格式将dataGridView导出到Excel

我有这个代码,我知道它运行得很快

CopyAlltoClipboard(dataGridViewControl);
Microsoft.Office.Interop.Excel.Application xlexcel;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlexcel = new Excel.Application();
xlexcel.Visible = true;
xlWorkBook = xlexcel.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Name = page.Name;
Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[1, 1];
CR.Select();
xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
((Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Range["A1"]).EntireColumn.Delete(null); // delete the first column that has rows indexes
xlWorkBook.SaveAs(fileName);

private void CopyAlltoClipboard(DataGridView dataGridViewControl)
{
    dataGridViewControl.SelectAll();
    DataObject dataObj = dataGridViewControl.GetClipboardContent();
    if (dataObj != null)
       Invoke((Action)(() => { Clipboard.SetDataObject(dataObj); }));
}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但它只复制值是excel,也不复制单元格格式(换行文本,背景颜色,字体,边框等)任何人都可以帮我这个吗?如何完成此代码具有DataGridView中的确切格式?

.net c# datagridview excel-interop cell-formatting

13
推荐指数
2
解决办法
9815
查看次数

来自HRESULT的异常:0x8002000B(DISP_E_BADINDEX)用于System.Runtime.InteropServices.COMException

我有一部分代码尝试将数据(从数据库)导出到Excel.当我尝试执行此任务时,它会生成此错误:

System.Runtime.InteropServices.COMException occurred
Additional information: Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))
Run Code Online (Sandbox Code Playgroud)

生成此错误的代码:

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.Worksheet)xlWorkBook.Worksheets.get_Item("Sheet3");
Run Code Online (Sandbox Code Playgroud)

代码行:

Page3 = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item("Sheet3");
Run Code Online (Sandbox Code Playgroud)

产生上述错误.不知道如何解决这个问题?

.net c# excel interop excel-interop

12
推荐指数
1
解决办法
5万
查看次数

使用十六进制更改Excel单元格的背景颜色会导致Excel在电子表格中显示完全不同的颜色

所以我将Excel单元格的内部颜色设置为某个值,如下所示:

worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;
Run Code Online (Sandbox Code Playgroud)

但是,当我在Excel中打开电子表格时,我看到出来的颜色完全不同(在上面的例子中,结果电子表格中的颜色是0xDCDCEF).我尝试了几种不同的颜色,它总是改变它,我没有看到一种模式.

这有什么理由吗?我甚至尝试通过编写Color.FromArgb(241,220,219).ToArgb()来设置颜色,同样的事情发生了.

c# excel vba interop excel-vba excel-interop

11
推荐指数
2
解决办法
2万
查看次数

Moq和Interop类型:在VS2012中工作,在VS2010中失败?

我有一个.NET库项目,大约有500个单元测试.所有这些测试在Visual Studio 2012中运行良好.但是,我的一些测试在Visual Studio 2010中失败.在这些失败的测试中,我使用Moq来模拟几个Interop类型Microsoft.Office.Interop.Excel.尝试访问这些模拟的互操作类型时,测试立即失败:

Error: Missing method 'instance class Microsoft.Office.Interop.Excel.Range [ExcelAddIn.Core] Microsoft.Office.Interop.Excel.ListRow::get_Range()' from class 'Castle.Proxies.ListRowProxy'.
Run Code Online (Sandbox Code Playgroud)

这个异常意味着我忘了在mock上设置适当的属性getter.事实并非如此:

_listRowMock.Setup(m => m.Range).Returns(_rangeMock.Object);
Run Code Online (Sandbox Code Playgroud)

现在我可以想象Moq对于Interop类型可能效果不佳.但我发现最令人费解的是,这些测试在Visual Studio 2012中运行良好,但在Visual Studio 2010中失败.

为什么我的Visual Studio会影响我的代码行为?

更新:2012年3月11日

好的,所以我明白了:

  • 我有两个项目; Core和Core.UnitTest.Core是实际的库,而Core.UnitTest是Core库的单元测试项目.
  • 这两个项目都引用了Microsoft.Office.Interop.Excel并启用了嵌入互操作类型.
  • 由于启用了EIT,因此两个项目都包含自己的Microsoft.Office.Interop.Excel库"视图".该视图包括其各自项目中使用的所有类,方法和属性.
  • 由于两个项目都使用Microsoft.Office.Interop.Excel的不同类,方法和属性,因此两个库的嵌入类型不同.例如,Core中的ListRow具有Index和Range属性,而Core.UnitTest中的ListRow仅具有Range属性.
  • 虽然两种类型都不同,并且不共享公共接口或超类,但它们是等效的.这意味着CLR会将它们视为相同,并允许您跨程序集边界使用这些类型.例如,Core.UnitTest中的ListRow实例在传递给Core库中的方法时可以正常工作.共享的Range属性将起作用,而缺少的Index属性将在访问时抛出MissingMethodException.
  • 上述行为甚至适用于模拟类型.Mock [Excel.ListRow]的模拟对象在跨越装配边界时可以正常工作.
  • 不幸的是,前一点中描述的行为仅在我在Visual Studio 2012中构建程序集时才有效.当我在Visual Studio 2010中构建程序集并调试我的代码时,我可以看到模拟的ListRow实例被传递到我的Core项目的方法中.实例越过程序集边界的那一刻,ListRow的所有方法和属性都会丢失它们的实现并抛出MissingMethodExceptions.
  • 现在,对于有趣的部分,我实际上通过确保两个嵌入类型的ListRow对齐来设法缓解此问题.例如,为了让编译器在两个项目中创建相同的ListRow视图,我确保在UnitTest项目中使用了完全相同的方法和属性.这意味着添加虚拟行,如:var dummy = listRow.Index.一旦我让编译器创建了我的嵌入式ListRow类型的相同视图,就允许该实例跨越程序集边界而不会丢失其实现.

问题仍然存在:是什么导致Visual Studio 2010和Visual Studio 2012之间的行为差​​异?

更新:2012年9月11日

演示解决方案:http://temp-share.com/show/KdPf6066h

我已经创建了一个小解决方案来演示效果.该解决方案由一个库和一个UnitTest项目组成.两者都引用了Microsoft.Office.Interop.Excel.Range并启用了EIT.该测试在VS2012中正常工作,但在VS2010中抛出MissingMethodException.在测试中取消注释虚拟线将使其在VS2010中工作.

最终更新:2012年12月29日

我为最新的更新道歉.我的一位同事找到了解决方案,但是我无法在我的机器上重现它.与此同时,我们公司已经转向TFS2012,因此这不再是我的阻塞问题.我的同事做出的两个最重要的结论是:

  • "Any CPU"平台的语义已从Visual Studio 2010更改为Visual Studio 2012.这将导致生成不同的.DLL,具体取决于您使用的是VS2010还是VS2012.
  • 这两个项目都引用了Microsoft.Office.Interop.Excel的不同版本.

我检查了我的项目并理顺了参考文献,但没有任何区别.之后,我在VS2010和VS2012中尝试了不同的平台变体,但无法产生令人满意的结果.我会接受杰里米的回答,因为这是最有帮助的.谢谢大家的帮助.

c# moq visual-studio-2010 excel-interop visual-studio-2012

11
推荐指数
1
解决办法
1854
查看次数

Excel互操作阻止显示密码对话框

我正在编写一个程序来清空空行和列中的excel文件,我从我自己的问题开始使用Interop从Excel文件中删除空行和列的最快方法,一切都很顺利.

问题是我想防止excel在工作簿受密码保护时显示密码对话框并抛出异常而不是那样.

在此输入图像描述

我使用以下代码使用interop打开excel文件:

 m_XlApp = New Excel.Application
 m_XlApp.visible = False
 m_XlApp.DisplayAlerts = False

 Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks
 Dim m_xlWrkb As Excel.Workbook
 m_xlWrkb = m_xlWrkbs.Open(strFile)

 m_xlWrkb.DoNotPromptForConvert = true          
Run Code Online (Sandbox Code Playgroud)

我尝试传递一个空密码,因为有些链接建议

m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="")
Run Code Online (Sandbox Code Playgroud)

或使用

m_xlWrkb.Unprotect("")
Run Code Online (Sandbox Code Playgroud)

但没有运气.

有什么建议?

c# vb.net excel excel-interop

11
推荐指数
1
解决办法
916
查看次数