1.前言
在做桌面系统C/S程序的过程中,不免要碰到将数据导出到Excel表格的需求,此时如果表格上的数据量不大,一般都会用office相关的动态库来导出;但是如果数据量很大,用office相关动态库的话速度便会缓慢,这个时候如果用Aspose.Cells.dll提供的相关方法,便可大大加快导出速度。
2.引用动态库
在NuGet程序包管理器中添加对Aspose.Cells.dll的引用:
3.相关方法代码
/// <summary>
/// 数据导出Excel
/// 新方法,采用Aspose.Cells.dll插件,比平常用office插件更快
/// </summary>
/// <param name="dgv"></param>
/// <param name="title"></param>
public static void ExportToExcelNew(DataGridView dgv, string title)
{
if (dgv is null)
{
return;
}
#region 路径选择对话框
// 申明保存对话框
var dlg = new SaveFileDialog();
// 默认文件后缀
dlg.DefaultExt = "xlsx";
// 文件后缀列表
dlg.Filter = "导出Excel(*.xls)|*.xlsx";
// 默然路径是系统当前路径
dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
// 文件名
dlg.FileName = title;
// 打开保存对话框
if (dlg.ShowDialog() == DialogResult.Cancel)
{
return;
}
// 返回文件路径
string fileNameString = dlg.FileName;
// 验证strFileName是否为空或值无效
if (string.IsNullOrEmpty(fileNameString.Trim()))
{
return;
}
#endregion
#region 将列表数据转换为DataTable
DataTable data = new DataTable();
foreach (DataGridViewColumn columnsItem in dgv.Columns)
{
data.Columns.Add(columnsItem.HeaderText, System.Type.GetType("System.String"));
}
//
for (int i = 0; i < dgv.Rows.Count; i++)
{
DataRow dr = data.NewRow();
for (int j = 0; j < data.Columns.Count; j++)
{
dr[j] = dgv.Rows[i].Cells[j].Value;
}
data.Rows.Add(dr);
}
#endregion
try
{
//Workbook book = new Workbook("E:\\test.xlsx"); //打开工作簿
Workbook book = new Workbook(); //创建工作簿
Worksheet sheet = book.Worksheets[0]; //创建工作表
Cells cells = sheet.Cells; //单元格
//创建样式
Style style = book.Styles[book.Styles.Add()];
style.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin; //应用边界线 左边界线
style.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin; //应用边界线 右边界线
style.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin; //应用边界线 上边界线
style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin; //应用边界线 下边界线
style.HorizontalAlignment = TextAlignmentType.Center; //单元格内容的水平对齐方式文字居中
style.Font.Name = "宋体"; //字体
//style.Font.IsBold = true; //设置粗体
style.Font.Size = 11; //设置字体大小
//表格填充数据
int Colnum = data.Columns.Count;//表格列数
int Rownum = data.Rows.Count;//表格行数
//生成行 列名行
for (int i = 0; i < Colnum; i++)
{
cells[0, i].PutValue(data.Columns[i].ColumnName); //添加表头
cells[0, i].SetStyle(style); //添加样式
//cells.SetColumnWidth(i, data.Columns[i].ColumnName.Length * 2 + 1.5); //自定义列宽
//cells.SetRowHeight(0, 30); //自定义高
}
//生成数据行
for (int i = 0; i < Rownum; i++)
{
for (int k = 0; k < Colnum; k++)
{
cells[1 + i, k].PutValue(data.Rows[i][k].ToString()); //添加数据
cells[1 + i, k].SetStyle(style); //添加样式
}
}
sheet.AutoFitColumns(); //自适应宽
book.Save(fileNameString); //保存
GC.Collect();
}
catch (Exception e)
{
Logger.Error("生成excel出错:" + e.Message);
}
}
4.方法引用
private void btnExport_Click(object sender, EventArgs e)
{
try
{
//这里dgvPrepaymentBalance是一个表格控件
GlobalFunc.ExportToExcelNew(dgvPrepaymentBalance, "预交金余额明细表");
}
catch (Exception ex)
{
Logger.Error(ex);
}
}