我的sqldatareader正在返回~200行数据。这些行中大约有一半的列包含整个xml文档。我假设此列导致autofit()方法挂起。我怎样才能让这个例子抛出异常或成功完成。我不关心哪一个,我只需要这个[自动化]程序来完成。
Excel.Application xl = null;
Excel._Workbook wb;
Excel._Worksheet ws;
try
{
xl = new Microsoft.Office.Interop.Excel.Application();
xl.Visible = false;
while (reader.HasRows && !done)
{
wb = (Excel._Workbook)(xl.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet));
ws = (Excel._Worksheet)wb.ActiveSheet;
// Insert column headers
for (int counter = 0; counter < reader.FieldCount; counter++)
ws.Cells[1, counter + 1] = reader.GetName(counter);
// Write the data to the excel file
while (reader.Read())
{
for (int counter = 1; counter <= reader.FieldCount; counter++)
{
// Need to format this column so excel doesn't change how it looks
if (report.ReportName == "RPTAAMVANetBatch" && reader.GetName(counter - 1) == "CorrelationID")
ws.Cells[rowCounter, counter] = String.Format("''{0}'", reader.GetValue(counter - 1));
else
ws.Cells[rowCounter, counter] = reader.GetValue(counter - 1);
}
rowCounter++;
}
RecordsProcessed = rowCounter - 1;
// Format the excel file to liking
ws.get_Range(ws.Cells[1, 1], ws.Cells[rowCounter - 1, reader.FieldCount]);
ws.Columns.AutoFit();
答案 0 :(得分:2)
继上面的评论之后,我使用的是我几天前创建的特定样本文件,其中有100行,在Col E
中,我有几封电子邮件的全部内容( I已经放了一个红框来保护电子邮件的身份和内容)
这是一个简单的VBA代码,我运行它来检查自动调整E
列
Sub Test()
Dim startTime As String
Dim endTime As String
startTime = Now
Columns("E:E").EntireColumn.AutoFit
endTime = Now
Debug.Print "The process started at " & startTime & " and got over at " & endTime
End Sub
<强>截图强>:
您的程序花费的时间更长,因为有200行,并且每个Excel单元格中的数据可能比我的更多。
那么解决方案是什么?
我能想到的最佳解决方案是在将大量数据写入之前将列扩展为MAX(254.86)。像这样的东西
Excel.Range Rng = ws.get_Range("E:E",System.Type.Missing);
Rng.EntireColumn.ColumnWidth = 254;
注意:请勿对该列或整个工作表使用自动调整功能。如果确实需要使用Autofit
,请将其分解。例如,在我的情况下,我会从第1列到第4列进行自动调整,然后从第6列到最后一列