zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#如何将DataTable导出到Excel解决方案

c#Excel导出解决方案 如何 dataTable
2023-06-13 09:14:41 时间
最近,由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到Excel中。

下面是我项目当中Excel.cs这个类的全部代码,通过这个类可以很容易地将DataTable中的数据导入到Excel方法中。

首先,必须要下载NPOI.dll这个程序集,
类代码如下:
复制代码代码如下:

usingSystem;
usingNPOI.HSSF;
usingNPOI.HPSF;
usingNPOI.HSSF.UserModel;
usingNPOI.HSSF.Util;
usingNPOI.SS.UserModel;
usingSystem.Collections;
usingSystem.IO;
usingSystem.Data;
namespaceBackupAttach
{
publicclassExcel
{
privateHSSFWorkbook_workBook;
privateISheet_wbSheet=null;
privateDataColumnCollection_columns=null;
privateint_col=0;//totalcolumns
privateint_row=0;//totalrows
privateint_sheet=0;//totalsheets
privateint_sheetRowNum=65536;//eachsheetallowrows
publicExcel()
{
InstanceWorkBook();
}
///<summary>
///实例方法
///</summary>
///<paramname="sheetRowNum">单个表单允许的最大行数</param>
publicExcel(intsheetRowNum)
{
_sheetRowNum=sheetRowNum;
InstanceWorkBook();
}
///<summary>
///实例方法
///</summary>
///<paramname="columns">表头</param>
publicExcel(DataColumnCollectioncolumns)
{
_columns=columns;
InstanceWorkBook();
}
privatevoidInstanceWorkBook()
{
/////cretateWorkBook
_workBook=newHSSFWorkbook();
vardsi=PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company="BaiyiTimes";
_workBook.DocumentSummaryInformation=dsi;
////createaentryofSummaryInformation
varsi=PropertySetFactory.CreateSummaryInformation();
si.Subject="EtimesSecureDocumentSystemLogBackup";
_workBook.SummaryInformation=si;
}
privateDataColumnCollectionGetColumns(DataColumnCollectioncolumns)
{
returncolumns==null||columns.Count==0?_columns:columns;
}
privateISheetGetSheet(ISheetsheet)
{
returnsheet==null?_wbSheet:sheet;
}
privatevoidCreateHeader(ISheetsheet,DataColumnCollectioncolumns)
{
_columns=GetColumns(columns);
/////createrowofcolumn
varoRow=sheet.CreateRow(0);
foreach(DataColumncolumnin_columns)
{
varoCell=oRow.CreateCell(_col);
varstyle1=_workBook.CreateCellStyle();
style1.FillForegroundColor=HSSFColor.BLUE.index2;
style1.FillPattern=FillPatternType.SOLID_FOREGROUND;
style1.Alignment=HorizontalAlignment.CENTER;
style1.VerticalAlignment=VerticalAlignment.CENTER;
varfont=_workBook.CreateFont();
font.Color=HSSFColor.WHITE.index;
style1.SetFont(font);
oCell.CellStyle=style1;
varname=column.ColumnName;
oCell.SetCellValue(name.ToString());
_col++;
}
/////headerbelongtorows
_row++;
}
privatevoidCreateHeader(ISheetsheet)
{
CreateHeader(sheet,null);
}
publicISheetCreateSheet()
{
returnCreateSheet(null);
}
publicISheetCreateSheet(DataColumnCollectioncolumns)
{
_wbSheet=_workBook.CreateSheet((_sheet+1).ToString());
CreateHeader(_wbSheet,columns);
_sheet++;
return_wbSheet;
}
publicvoidSetRowValue(DataRowCollectionrows,ISheetsheet)
{
_wbSheet=GetSheet(sheet);
foreach(DataRowrowinrows)
{
SetRowValue(row);
}
}
publicvoidSetRowValue(DataRowCollectionrows)
{
SetRowValue(rows,null);
}
publicvoidSetRowValue(DataRowrow)
{
//createanewsheet
if(_row%_sheetRowNum==0)
{
CreateSheet();
}
varoRow=_wbSheet.CreateRow(_row%_sheetRowNum);
varobj=string.Empty;
varcell=0;
foreach(DataColumncolumnin_columns)
{
obj=row[column.ColumnName].ToString();
oRow.CreateCell(cell).SetCellValue(obj);
cell++;
}
_row++;
}
publicvoidSetProtectPassword(stringpassword,stringusername)
{
_workBook.WriteProtectWorkbook(password,username);
}
publicvoidSaveAs(stringfilePath)
{
if(File.Exists(filePath))File.Delete(filePath);
varfile=newFileStream(filePath,FileMode.Create);
_workBook.Write(file);
file.Close();
}
}
}

下面给出小Demo共参考:
复制代码代码如下:

publicvoidDataTableToExcel(DataTabledt,stringpath)
{
//instanceexcelobject
//Excelexcel=newExcel(65536);
Excelexcel=newExcel();
//createasheet
excel.CreateSheet(dt.Columns);
//writevalueintorows
//excel.SetRowValue(dt.Rows);
foreach(DataRowrowindt.Rows)
{
excel.SetRowValue(row);
}
//setexcelprotected
excel.SetProtectPassword("etimes2011@","baiyi");
//saveexcelfiletolocal
excel.SaveAs(path);
}

缺点:如果要导入到Excel中的数据量较多时(几十万或者几百万行),全部一次性放到DataTable中可能会对内存消耗很大,建议每次导入的数据最好不要超过1000条,可采取分页查询的方式将数据导入Excel中。

优点:1997-2003版本的xls中每个表单最大只支持65536行,2010可以支持1048576行,考虑到客户机上安装的版本不一样,故Excel对象每个表单最大支持65536行,当表单到达最大行数时,Excel对象内部会自动创建新表单,在往Excel中写数据的时候不用考虑这一点,这样调用的时候更为方便