我正在使用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) 我有用户提供的需要转换为PDF的excel文件.使用excel互操作,我可以做到这一点.ExportAsFixedFormat().当工作簿有数百万行时,我的问题出现了.这将变成一个有50k +页面的文件.如果工作簿在所有这些行中都有内容,那就没问题.每次出现其中一个文件时,可能有50行有内容,其余的都是空白.我怎样才能删除空行,以便将其导出为合适大小的PDF?
我已经尝试从最后一行开始,一个接一个,CountA用来检查行是否有内容,如果有,则删除它.这不仅需要永远,这似乎在大约100k行后失败,并出现以下错误:
无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上.
我尝试过使用SpecialCells(XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues)但如果任何单元格有格式(如bg颜色),则包含一行.
我尝试过使用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) 我正在开发一个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) 以下代码将运行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#将自定义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程序集,或者无论如何都不会正确地公开它们.
我有这个代码,我知道它运行得很快
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中的确切格式?
我有一部分代码尝试将数据(从数据库)导出到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)
产生上述错误.不知道如何解决这个问题?
所以我将Excel单元格的内部颜色设置为某个值,如下所示:
worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;
Run Code Online (Sandbox Code Playgroud)
但是,当我在Excel中打开电子表格时,我看到出来的颜色完全不同(在上面的例子中,结果电子表格中的颜色是0xDCDCEF).我尝试了几种不同的颜色,它总是改变它,我没有看到一种模式.
这有什么理由吗?我甚至尝试通过编写Color.FromArgb(241,220,219).ToArgb()来设置颜色,同样的事情发生了.
我有一个.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日
好的,所以我明白了:
问题仍然存在:是什么导致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,因此这不再是我的阻塞问题.我的同事做出的两个最重要的结论是:
我检查了我的项目并理顺了参考文献,但没有任何区别.之后,我在VS2010和VS2012中尝试了不同的平台变体,但无法产生令人满意的结果.我会接受杰里米的回答,因为这是最有帮助的.谢谢大家的帮助.
我正在编写一个程序来清空空行和列中的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)
但没有运气.
有什么建议?
excel-interop ×10
c# ×9
excel ×6
interop ×3
.net ×2
vb.net ×2
asp.net ×1
datagridview ×1
dispose ×1
excel-2007 ×1
excel-vba ×1
moq ×1
mysql ×1
vba ×1
xml ×1