【发布时间】:2010-09-20 13:53:50
【问题描述】:
目前我有一个应用程序,它从 SQLite 数据库获取信息并将其放入 Excel。但是,我必须获取每个 DataRow,遍历每个项目,并将每个值放入它自己的单元格并确定突出显示。这导致将 9000 条记录文件导出到 Excel 需要 20 分钟。我相信它可以比这更快地完成。我的想法是我可以使用数据源来填充 Excel 范围,然后使用列标题和行号来格式化那些需要格式化的行。但是,当我在网上查看时,无论我似乎键入什么,它总是显示使用 Excel 作为数据库的示例,而不是导入到 Excel 中。除非我忘记了一个关键词或 to。现在,这个功能必须在代码中完成,因为它是更大应用程序的一部分。否则,我只会让 Excel 连接到数据库并自行提取信息。不幸的是,事实并非如此。任何可以帮助我快速加载 Excel 工作表的信息将不胜感激。谢谢。
其他信息:
必须在代码中从数据库中提取信息的另一个原因是,并非每台加载该信息的计算机都有 Excel在上面。可能会简单地告诉使用该应用程序的人导出数据并将其通过电子邮件发送给他们的主管。安装应用程序包含应用程序生成正确格式所需的 dll。
示例代码(当前):
For Each strTemp In strColumns
excelRange = worksheet.Cells(1, nCounter)
excelRange.Select()
excelRange.Value2 = strTemp
excelRange.Interior.Color = System.Drawing.Color.Gray.ToArgb()
excelRange.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Type.Missing)
nCounter += 1
Next
现在,这只是我正在进行的迭代的示例代码。在我真正处理来自数据库的信息的地方,我正在遍历 dataTable 的 Rows,然后遍历 dataRow 中的项目并执行与上述基本相同的操作;逐个值,选择范围并将值放入单元格中,如果单元格是报表的一部分(不总是灰色),则格式化单元格,然后移动到下一组数据。我想做的是将所有数据放在excel表中(A2:??,不是一行,而是多行),然后遍历报告并格式化每一行。这样一来,我唯一一次遍历所有记录就是每条记录都是报表的一部分。
理想代码
excelRange = worksheet.Cells("A2", "P9000")
excelRange.DataSource = ds 'ds would be a queried dataSet, and I know there is no excelRange.DataSource.
'Iteration code to format cells
更新:
我知道我的示例是用 VB 编写的,但因为我的老板更喜欢 VB,所以我也在尝试编写应用程序的 VB 版本。但是,这是我使用 Recordset 的最终代码。 ConvertToRecordset 函数来自here。
private void CreatePartSheet(Excel.Worksheet excelWorksheet)
{
_dataFactory.RevertDatabase();
excelWorksheet.Name = "Part Sheet";
string[] strColumns = Constants.strExcelPartHeaders;
CreateSheetHeader(excelWorksheet, strColumns);
System.Drawing.Color clrPink = System.Drawing.Color.FromArgb(203, 192, 255);
System.Drawing.Color clrGreen = System.Drawing.Color.FromArgb(100, 225, 137);
string[] strValuesAndTitles = {/*...Column Names...*/};
List<string> lstColumns = strValuesAndTitles.ToList<string>();
System.Data.DataSet ds = _dataFactory.GetDataSet(Queries.strExport);
ADODB.Recordset rs = ConvertToRecordset(ds.Tables[0]);
excelRange = excelWorksheet.get_Range("A2", "ZZ" + rs.RecordCount.ToString());
excelRange.Cells.CopyFromRecordset(rs, rs.RecordCount, rs.Fields.Count);
int nFieldCount = rs.Fields.Count;
for (int nCounter = 0; nCounter < rs.RecordCount; nCounter++)
{
int nRowCounter = nCounter + 2;
List<ReportRecord> rrPartReports = _lstReports.FindAll(rr => rr.PartID == nCounter).ToList<ReportRecord>();
excelRange = (Excel.Range)excelWorksheet.get_Range("A" + nRowCounter.ToString(), "K" + nRowCounter.ToString());
excelRange.Select();
excelRange.NumberFormat = "@";
if (rrPartReports.Count > 0)
{
excelRange.Interior.Color = System.Drawing.Color.FromArgb(230, 216, 173).ToArgb(); //Light Blue
foreach (ReportRecord rr in rrPartReports)
{
if (lstColumns.Contains(rr.Title))
{
excelRange = (Excel.Range)excelWorksheet.Cells[nRowCounter, lstColumns.IndexOf(rr.Title) + 1];
excelRange.Interior.Color = rr.Description.ToUpper().Contains("TAG") ? clrGreen.ToArgb() : clrPink.ToArgb();
if (rr.Description.ToUpper().Contains("TAG"))
{
rs.Find("PART_ID=" + (nCounter + 1).ToString(), 0, ADODB.SearchDirectionEnum.adSearchForward, "");
excelRange.AddComment(Environment.UserName + ": " + _dataFactory.GetTaggedPartPrevValue(rs.Fields["POSITION"].Value.ToString(), rr.Title));
}
}
}
}
if (nRowCounter++ % 500 == 0)
{
progress.ProgressComplete = ((double)nRowCounter / (double)rs.RecordCount) * (double)100;
Notify();
}
}
rs.Close();
excelWorksheet.Columns.AutoFit();
progress.Message = "Done Exporting to Excel";
Notify();
_dataFactory.RestoreDatabase();
}
【问题讨论】:
-
您目前如何创建 Excel 文档 ActiveX?它是什么版本的 Excel?
-
@Tim Murphy - 我使用的是 Interop dll (Microsoft.Office.Interop.Excel),它的版本是 12 (Office 2007)。
标签: excel visual-studio-2008 vba export-to-excel