DataGridView如何快速导出Excel

时间:2022-04-29 18:26:35

从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法。

最后从外文网站上找到解决办法,使用ws.get_Range(excelRange, Type.Missing).Value2方法批量设置单元格的值。详细代码如下:

    public void DataToExcelFast(DataGridView dgv, string fName)
{
try
{
Excel.Application excel = new Excel.Application();
Excel.Workbook wb = excel.Workbooks.Add(true);
Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
ws.Name = fName;
string sFile = string.Empty;
SaveFileDialog dialog = new SaveFileDialog();
dialog.Title = "Save export file";
dialog.Filter = "EXECL File(*.xlsx) |.xlsx";
dialog.FileName = fName;
dialog.FilterIndex = ;
if (dialog.ShowDialog() == DialogResult.OK)
{
string FileName = dialog.FileName;
if (File.Exists(FileName))
File.Delete(FileName);
sFile = FileName;
excel.Visible = false;
excel.DisplayAlerts = false;
excel.Calculation = Excel.XlCalculation.xlCalculationManual;
ArrayList cols = new ArrayList();
#region 列标题,并根据列的数据类型设置Excel列的格式
int visibleColumnCount = ;
foreach (DataGridViewColumn col in dgv.Columns)
{
if (col.Visible)
{
visibleColumnCount++;
ws.Cells[, visibleColumnCount].Value2 = col.HeaderText.ToString();
ws.Cells[, visibleColumnCount].Font.Bold = true;
cols.Add(col.Name);
if (col.ValueType != null)
{
if (col.ValueType.Name.Equals("DateTime"))
{
ws.Columns[visibleColumnCount].NumberFormatLocal = @"yyyy-mm-dd HH:mm";
ws.Columns[visibleColumnCount].Font.Color
= System.Drawing.ColorTranslator.ToOle(Color.Blue);
}
else if (col.ValueType.Name.Equals("Decimal")
|| col.ValueType.Name.Equals("Double"))
{
ws.Columns[visibleColumnCount].NumberFormat = "0.00";
}
else if (col.ValueType.Name.Equals("Int32"))
{
ws.Columns[visibleColumnCount].NumberFormat = "";
}
else
{
ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
}
}
else
ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
}
}
#endregion
#region 写入行
// Copy each DataTable
// Copy the DataTable to an object array
object[,] rawData = new object[dgv.Rows.Count, cols.Count];
// Copy the column names to the first row of the object array
for (int col = ; col < cols.Count; col++)
{
rawData[, col] = cols[col];
}
// Copy the values to the object array
for (int col = ; col < cols.Count; col++)
{
for (int row = ; row < dgv.Rows.Count; row++)
{
rawData[row, col] = dgv.Rows[row].Cells[cols[col].ToString()].Value;
}
}
// Calculate the final column letter
string finalColLetter = string.Empty;
string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int colCharsetLen = colCharset.Length;
if (cols.Count > colCharsetLen)
{
finalColLetter = colCharset.Substring(
(cols.Count - ) / colCharsetLen - , );
}
finalColLetter += colCharset.Substring(
(cols.Count - ) % colCharsetLen, );
// Fast data export to Excel
string excelRange = string.Format("A2:{0}{1}",
finalColLetter, dgv.Rows.Count + );
ws.get_Range(excelRange, Type.Missing).Value2 = rawData;
#endregion
excel.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
// 51表示2007-2010格式的xlsx
ws.SaveAs(FileName, , Type.Missing, Type.Missing,
Type.Missing, Type.Missing,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing);
wb.Close(true, Type.Missing, Type.Missing);
excel.Quit();
// 安全回收进程
System.GC.GetGeneration(excel);
if (MessageBox.Show("已经导出Excel,您是否要打开?", "提示",
MessageBoxButtons.YesNo) == DialogResult.Yes)
System.Diagnostics.Process.Start(FileName);
}
}
catch (Exception ex)
{
MessageBox.Show("导出Excel时遇到错误\r\n" + ex.Message,
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}