Excel._Worksheet.Columns.Autofit()方法挂起

时间:2013-04-05 18:14:04

标签: c# excel

我的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();

1 个答案:

答案 0 :(得分:2)

继上面的评论之后,我使用的是我几天前创建的特定样本文件,其中有100行,在Col E中,我有几封电子邮件的全部内容( I已经放了一个红框来保护电子邮件的身份和内容

enter image description here

这是一个简单的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

<强>截图

enter image description here

您的程序花费的时间更长,因为有200行,并且每个Excel单元格中的数据可能比我的更多。

那么解决方案是什么?

我能想到的最佳解决方案是在将大量数据写入之前将列扩展为MAX(254.86)。像这样的东西

        Excel.Range Rng = ws.get_Range("E:E",System.Type.Missing);

        Rng.EntireColumn.ColumnWidth = 254;

注意:请勿对该列或整个工作表使用自动调整功能。如果确实需要使用Autofit,请将其分解。例如,在我的情况下,我会从第1列到第4列进行自动调整,然后从第6列到最后一列