using ExcelReport; using ExcelUtility.Base; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace ExcelUtility { public sealed class Export { /// <summary> /// 由DataSet导出Excel /// </summary> /// <param name="sourceTable">要导出数据的DataTable</param> /// <param name="filePath">导出路径,可选</param> /// <returns></returns> public static string ToExcel(DataSet sourceDs, string filePath = null ) { if ( string .IsNullOrEmpty(filePath)) { filePath = Common.GetSaveFilePath(); } if ( string .IsNullOrEmpty(filePath)) return null ; bool isCompatible = Common.GetIsCompatible(filePath); IWorkbook workbook = Common.CreateWorkbook(isCompatible); ICellStyle headerCellStyle = Common.GetCellStyle(workbook, true ); ICellStyle cellStyle = Common.GetCellStyle(workbook); for ( int i = 0; i < sourceDs.Tables.Count; i++) { DataTable table = sourceDs.Tables[i]; string sheetName = string .IsNullOrEmpty(table.TableName) ? "result" + i.ToString() : table.TableName; ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in table.Columns) { ICell headerCell = headerRow.CreateCell(column.Ordinal); headerCell.SetCellValue(column.ColumnName); headerCell.CellStyle = headerCellStyle; sheet.AutoSizeColumn(headerCell.ColumnIndex); } // handling value. int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { ICell cell = dataRow.CreateCell(column.Ordinal); cell.SetCellValue((row[column] ?? "" ).ToString()); cell.CellStyle = cellStyle; Common.ReSizeColumnWidth(sheet, cell); } rowIndex++; } } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); workbook = null ; return filePath; } /// <summary> /// 由DataTable导出Excel /// </summary> /// <param name="sourceTable">要导出数据的DataTable</param> /// <param name="colAliasNames">导出的列名重命名数组</param> /// <param name="sheetName">工作薄名称,可选</param> /// <param name="filePath">导出路径,可选</param> /// <returns></returns> public static string ToExcel(DataTable sourceTable, string [] colAliasNames, string sheetName = "result" , string filePath = null ) { if (sourceTable.Rows.Count <= 0) return null ; if ( string .IsNullOrEmpty(filePath)) { filePath = Common.GetSaveFilePath(); } if ( string .IsNullOrEmpty(filePath)) return null ; if (colAliasNames == null || sourceTable.Columns.Count != colAliasNames.Length) { throw new ArgumentException( "列名重命名数组与DataTable列集合不匹配。" , "colAliasNames" ); } bool isCompatible = Common.GetIsCompatible(filePath); IWorkbook workbook = Common.CreateWorkbook(isCompatible); ICellStyle headerCellStyle = Common.GetCellStyle(workbook, true ); ICellStyle cellStyle = Common.GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in sourceTable.Columns) { ICell headerCell = headerRow.CreateCell(column.Ordinal); headerCell.SetCellValue(colAliasNames[column.Ordinal]); headerCell.CellStyle = headerCellStyle; sheet.AutoSizeColumn(headerCell.ColumnIndex); } // handling value. int rowIndex = 1; foreach (DataRow row in sourceTable.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in sourceTable.Columns) { ICell cell = dataRow.CreateCell(column.Ordinal); cell.SetCellValue((row[column] ?? "" ).ToString()); cell.CellStyle = cellStyle; Common.ReSizeColumnWidth(sheet, cell); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); sheet = null ; headerRow = null ; workbook = null ; return filePath; } /// <summary> /// 由DataGridView导出 /// </summary> /// <param name="grid">要导出的DataGridView对象</param> /// <param name="sheetName">工作薄名称,可选</param> /// <param name="filePath">导出路径,可选</param> /// <returns></returns> public static string ToExcel(DataGridView grid, string sheetName = "result" , string filePath = null ) { if (grid.Rows.Count <= 0) return null ; if ( string .IsNullOrEmpty(filePath)) { filePath = Common.GetSaveFilePath(); } if ( string .IsNullOrEmpty(filePath)) return null ; bool isCompatible = Common.GetIsCompatible(filePath); IWorkbook workbook = Common.CreateWorkbook(isCompatible); ICellStyle headerCellStyle = Common.GetCellStyle(workbook, true ); ICellStyle cellStyle = Common.GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); for ( int i = 0; i < grid.Columns.Count; i++) { ICell headerCell = headerRow.CreateCell(i); headerCell.SetCellValue(grid.Columns[i].HeaderText); headerCell.CellStyle = headerCellStyle; sheet.AutoSizeColumn(headerCell.ColumnIndex); } int rowIndex = 1; foreach (DataGridViewRow row in grid.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); for ( int n = 0; n < grid.Columns.Count; n++) { ICell cell = dataRow.CreateCell(n); cell.SetCellValue((row.Cells[n].Value ?? "" ).ToString()); cell.CellStyle = cellStyle; Common.ReSizeColumnWidth(sheet, cell); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); sheet = null ; headerRow = null ; workbook = null ; return filePath; } /// <summary> /// 由DataTable导出Excel /// </summary> /// <param name="sourceTable">要导出数据的DataTable</param> /// <param name="sheetName">工作薄名称,可选</param> /// <param name="filePath">导出路径,可选</param> /// <param name="colNames">需要导出的列名,可选</param> /// <param name="colAliasNames">导出的列名重命名,可选</param> /// <returns></returns> public static string ToExcel(DataTable sourceTable, string sheetName = "result" , string filePath = null , string [] colNames = null , IDictionary< string , string > colAliasNames = null ) { if (sourceTable.Rows.Count <= 0) return null ; if ( string .IsNullOrEmpty(filePath)) { filePath = Common.GetSaveFilePath(); } if ( string .IsNullOrEmpty(filePath)) return null ; bool isCompatible = Common.GetIsCompatible(filePath); IWorkbook workbook = Common.CreateWorkbook(isCompatible); ICellStyle headerCellStyle = Common.GetCellStyle(workbook, true ); ICellStyle cellStyle = Common.GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); if (colNames == null || colNames.Length <= 0) { colNames = sourceTable.Columns.Cast<DataColumn>().OrderBy(c => c.Ordinal).Select(c => c.ColumnName).ToArray(); } // handling header. for ( int i = 0; i < colNames.Length; i++) { ICell headerCell = headerRow.CreateCell(i); if (colAliasNames != null && colAliasNames.ContainsKey(colNames[i])) { headerCell.SetCellValue(colAliasNames[colNames[i]]); } else { headerCell.SetCellValue(colNames[i]); } headerCell.CellStyle = headerCellStyle; sheet.AutoSizeColumn(headerCell.ColumnIndex); } // handling value. int rowIndex = 1; foreach (DataRow row in sourceTable.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); for ( int i = 0; i < colNames.Length; i++) { ICell cell = dataRow.CreateCell(i); cell.SetCellValue((row[colNames[i]] ?? "" ).ToString()); cell.CellStyle = cellStyle; Common.ReSizeColumnWidth(sheet, cell); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); sheet = null ; headerRow = null ; workbook = null ; return filePath; } /// <summary> ///由SheetFormatterContainer导出基于EXCEL模板的文件 /// </summary> /// <param name="templatePath">模板路径</param> /// <param name="sheetName">模板中使用的工作薄名称</param> /// <param name="formatterContainer">模板数据格式化容器</param> /// <param name="filePath">导出路径,可选</param> /// <returns></returns> public static string ToExcelWithTemplate<T>( string templatePath, string sheetName, SheetFormatterContainer<T> formatterContainer, string filePath = null ) { if (!File.Exists(templatePath)) { throw new FileNotFoundException(templatePath + "文件不存在!" ); } if ( string .IsNullOrEmpty(filePath)) { filePath = Common.GetSaveFilePath(); } if ( string .IsNullOrEmpty(filePath)) return null ; string templateConfigFilePath = Common.GetTemplateConfigFilePath(templatePath, false ); var workbookParameterContainer = new WorkbookParameterContainer(); workbookParameterContainer.Load(templateConfigFilePath); SheetParameterContainer sheetParameterContainer = workbookParameterContainer[sheetName]; ExportHelper.ExportToLocal(templatePath, filePath, new SheetFormatter(sheetName, formatterContainer.GetFormatters(sheetParameterContainer))); return filePath; } } } |