Recently, because the company project required all logs of user operations in the system to be transferred and backed up, and considering that they may need to be restored in the future, we finally decided to back up the log data to Excel.
The following is all the code of the Excel.cs class in my project. Through this class, the data in the DataTable can be easily imported into the Excel method.
First of all, you must download the NPOI.dll assembly.
The class code is as follows:
using System; using NPOI.HSSF; using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.UserModel; using System.Collections; using System.IO; using System.Data; namespace BackupAttach { public class Excel { private HSSFWorkbook _workBook; private ISheet _wbSheet = null; private DataColumnCollection _columns = null; private int _col = 0; //total columns private int _row = 0; //total rows private int _sheet = 0; //total sheets private int _sheetRowNum = 65536; //each sheet allow rows public Excel() { InstanceWorkBook(); } /// <summary> /// 实例方法 /// </summary> /// <param name="sheetRowNum">单个表单允许的最大行数</param> public Excel(int sheetRowNum) { _sheetRowNum = sheetRowNum; InstanceWorkBook(); } /// <summary> /// 实例方法 /// </summary> /// <param name="columns">表头</param> public Excel(DataColumnCollection columns) { _columns = columns; InstanceWorkBook(); } private void InstanceWorkBook() { /////cretate WorkBook _workBook = new HSSFWorkbook(); var dsi = PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "BaiyiTimes"; _workBook.DocumentSummaryInformation = dsi; ////create a entry of SummaryInformation var si = PropertySetFactory.CreateSummaryInformation(); si.Subject = "Etimes Secure Document System Log Backup"; _workBook.SummaryInformation = si; } private DataColumnCollection GetColumns(DataColumnCollection columns) { return columns == null || columns.Count == 0 ? _columns : columns; } private ISheet GetSheet(ISheet sheet) { return sheet == null ? _wbSheet : sheet; } private void CreateHeader(ISheet sheet, DataColumnCollection columns) { _columns = GetColumns(columns); /////create row of column var oRow = sheet.CreateRow(0); foreach (DataColumn column in _columns) { var oCell = oRow.CreateCell(_col); var style1 = _workBook.CreateCellStyle(); style1.FillForegroundColor = HSSFColor.BLUE.index2; style1.FillPattern = FillPatternType.SOLID_FOREGROUND; style1.Alignment = HorizontalAlignment.CENTER; style1.VerticalAlignment = VerticalAlignment.CENTER; var font = _workBook.CreateFont(); font.Color = HSSFColor.WHITE.index; style1.SetFont(font); oCell.CellStyle = style1; var name = column.ColumnName; oCell.SetCellValue(name.ToString()); _col++; } ///// header belong to rows _row++; } private void CreateHeader(ISheet sheet) { CreateHeader(sheet, null); } public ISheet CreateSheet() { return CreateSheet(null); } public ISheet CreateSheet(DataColumnCollection columns) { _wbSheet = _workBook.CreateSheet((_sheet + 1).ToString()); CreateHeader(_wbSheet, columns); _sheet++; return _wbSheet; } public void SetRowValue(DataRowCollection rows, ISheet sheet) { _wbSheet = GetSheet(sheet); foreach (DataRow row in rows) { SetRowValue(row); } } public void SetRowValue(DataRowCollection rows) { SetRowValue(rows, null); } public void SetRowValue(DataRow row) { // create a new sheet if (_row % _sheetRowNum == 0) { CreateSheet(); } var oRow = _wbSheet.CreateRow(_row % _sheetRowNum); var obj = string.Empty; var cell = 0; foreach (DataColumn column in _columns) { obj = row[column.ColumnName].ToString(); oRow.CreateCell(cell).SetCellValue(obj); cell++; } _row++; } public void SetProtectPassword(string password, string username) { _workBook.WriteProtectWorkbook(password, username); } public void SaveAs(string filePath) { if (File.Exists(filePath)) File.Delete(filePath); var file = new FileStream(filePath, FileMode.Create); _workBook.Write(file); file.Close(); } } }
The following is a small demo reference:
public void DataTableToExcel(DataTable dt,string path) { //instance excel object //Excel excel = new Excel(65536); Excel excel = new Excel(); //create a sheet excel.CreateSheet(dt.Columns); //write value into rows //excel.SetRowValue(dt.Rows); foreach (DataRow row in dt.Rows) { excel.SetRowValue(row); } // set excel protected excel.SetProtectPassword("etimes2011@", "baiyi"); // save excel file to local excel.SaveAs(path); }
Disadvantages: If When the amount of data to be imported into Excel is large (hundreds of thousands or millions of rows), putting it all into the DataTable at once may consume a lot of memory. It is recommended that the data imported each time should not exceed 1,000 pieces. Import data into Excel using paging query.
Advantages: Each form in the 1997-2003 version of xls only supports a maximum of 65536 rows, and 2010 can support 1048576 rows. Considering that the versions installed on the client are different, each Excel object form supports a maximum of 65536 rows. , when the form reaches the maximum number of rows, a new form will be automatically created inside the Excel object. You don’t need to consider this when writing data to Excel, which is more convenient when calling.
For more C# related articles on how to export DataTable to Excel solutions, please pay attention to the PHP Chinese website!