using System.Collections; using System.Data; using System.Text; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; namespace Gs.Toolbox; /// /// xls操作类 /// public class ExcelHelper { /// /// DataTable导出到Excel的MemoryStream /// /// 源DataTable /// 表头文本 /// public static MemoryStream Export(DataTable dtSource, string strHeaderText) { IWorkbook workbook = new HSSFWorkbook(); var sheet = workbook.CreateSheet(); var dateStyle = workbook.CreateCellStyle(); var format = workbook.CreateDataFormat(); //dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); //取得列宽 var arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) arrColWidth[item.Ordinal] = Encoding.GetEncoding(936) .GetBytes(item.ColumnName).Length; for (var i = 0; i < dtSource.Rows.Count; i++) for (var j = 0; j < dtSource.Columns.Count; j++) { var intTemp = Encoding.GetEncoding(936) .GetBytes(dtSource.Rows[i][j].ToString()).Length; if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp; } var rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 65535 || rowIndex == 0) { if (rowIndex != 0) sheet = workbook.CreateSheet(); #region 列头及样式 { var headerRow = sheet.CreateRow(0); var headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; var font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal) .SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } } #endregion rowIndex = 1; } #endregion #region 填充内容 foreach (DataColumn column in dtSource.Columns) { var dataRow = sheet.CreateRow(rowIndex); var newCell = dataRow.CreateCell(column.Ordinal); var drValue = row[column].ToString(); switch (column.DataType.ToString()) { case "System.String": //字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime": //日期类型 DateTime dateV; DateTime.TryParse(drValue, out dateV); newCell.SetCellValue(dateV); newCell.CellStyle = dateStyle; //格式化显示 break; case "System.Boolean": //布尔型 var boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": var intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal": //浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull": //空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion rowIndex++; } using (var ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; } } /// /// DataTable导出到Excel文件 /// /// 源DataTable /// 表头文本 /// 保存位置 public static void Export(DataTable dtSource, string strHeaderText, string strFileName) { using (var ms = Export(dtSource, strHeaderText)) { using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { var data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// /// /// /// public static void ExportAryHead(DataTable dtSource , ArrayList aryHeader , string strFileName , ArrayList aryFotter = null , ArrayList aryFotter2 = null , int fixW = 0) { var roct = aryHeader.Count; IWorkbook workbook = new HSSFWorkbook(); var sheet = workbook.CreateSheet(); //取得列宽 var arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) arrColWidth[item.Ordinal] = Encoding.GetEncoding(936) .GetBytes(item.ColumnName).Length; if (fixW <= 0) for (var i = 0; i < dtSource.Rows.Count; i++) for (var j = 0; j < dtSource.Columns.Count; j++) { var intTemp = Encoding.GetEncoding(936) .GetBytes(dtSource.Rows[i][j].ToString()).Length; if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp; } var cusRow = sheet.CreateRow(0); var _rr = 0; foreach (string _hh in aryHeader) { cusRow = sheet.CreateRow(_rr); cusRow.CreateCell(0).SetCellValue(_hh); //cellRangAddress参数说明:起始行,结束行,起始列,结束列 sheet.AddMergedRegion(new CellRangeAddress(_rr, _rr, 0, dtSource.Columns.Count - 1)); // sheet.AddMergedRegion(new Region(0, 0, _rr, dtSource.Columns.Count - 1)); _rr++; } //填充表头 var headerRow = sheet.CreateRow(roct); var headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; headStyle.FillPattern = FillPattern.SolidForeground; headStyle.FillForegroundColor = HSSFColor.LightBlue.Index; var font = workbook.CreateFont(); font.Color = HSSFColor.White.Index; font.FontHeightInPoints = 12; font.Boldweight = 700; headStyle.SetFont(font); foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal) .SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 6) * 256); } //sheet.SetAutoFilter(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); //首行筛选 // if (fixW <= 0) sheet.CreateFreezePane(dtSource.Columns.Count, 1 + aryHeader.Count); //首行冻结 //填充内容 var dataRow = sheet.CreateRow(roct + 1); for (var i = 0; i < dtSource.Rows.Count; i++) { dataRow = sheet.CreateRow(i + roct + 1); for (var j = 0; j < dtSource.Columns.Count; j++) dataRow.CreateCell(j) .SetCellValue(dtSource.Rows[i][j].ToString()); } //填充footer if (aryFotter != null && aryFotter.Count > 0) { var _rot = roct + dtSource.Rows.Count + 2; var ftRow = sheet.CreateRow(_rot); var _ftidx = 0; var _ftw = dtSource.Columns.Count / 2; foreach (string _hh in aryFotter) { var ftStyle = workbook.CreateCellStyle(); ftStyle.FillPattern = FillPattern.SolidForeground; ftStyle.FillForegroundColor = HSSFColor.White.Index; if (_ftidx == 0) ftStyle.BorderTop = BorderStyle.Thin; else ftStyle.BorderTop = BorderStyle.None; if (_ftidx == aryFotter.Count - 1) ftStyle.BorderBottom = BorderStyle.Thin; else ftStyle.BorderBottom = BorderStyle.None; ftRow = sheet.CreateRow(_rot); ftRow.CreateCell(0).SetCellValue(_hh); ftRow.GetCell(0).CellStyle = ftStyle; //cellRangAddress参数说明:起始行,结束行,起始列,结束列 sheet.AddMergedRegion( new CellRangeAddress(_rot, _rot, 0, _ftw - 1)); ftRow.CreateCell(_ftw) .SetCellValue(aryFotter2[_ftidx].ToString()); ftRow.GetCell(_ftw).CellStyle = ftStyle; sheet.AddMergedRegion(new CellRangeAddress(_rot, _rot, _ftw, dtSource.Columns.Count - 1)); for (var c = 0; c < dtSource.Columns.Count; c++) { var cell = HSSFCellUtil.GetCell(ftRow, c); cell.CellStyle = ftStyle; } _rot++; _ftidx++; } } //保存 using (var ms = new MemoryStream()) { using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { workbook.Write(ms); ms.Flush(); ms.Position = 0; var data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// /// /// /// 字体大小 /// 是否粗体 /// 是否中间 /// 是否边框 /// private static ICellStyle getStyle(HSSFWorkbook workbook, double fontSize = 11, bool isBold = false, bool isCenter = false, bool border = true) { IFont font = workbook.CreateFont(); font.FontName = "宋体"; font.FontHeightInPoints = fontSize; if (isBold == true) font.Boldweight = (short)FontBoldWeight.Bold; // 创建单元格样式 - 带边框和指定字体 ICellStyle style = workbook.CreateCellStyle(); style.SetFont(font); if (border == true) { style.BorderTop = BorderStyle.Thin; style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; } if (isCenter == true) style.Alignment = HorizontalAlignment.Center; style.VerticalAlignment = VerticalAlignment.Center; return style; } /// /// 设置单元格的值 /// /// /// /// /// private static void setCellVal(ISheet sheet, int rowIdx, int colIdx, string val) { IRow row = sheet.GetRow(rowIdx) ?? sheet.CreateRow(rowIdx); ICell cell = row.GetCell(colIdx) ?? row.CreateCell(colIdx); cell.SetCellValue(val); // 可以设置字符串、数字等类型的数据 } /// /// 生成首检 /// /// public static void ExportShouJian(DataSet dtSource, string strFileName) { //行高 int rowHeight = 25; //总7列 int maxCols = 7; // 创建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建单元格样式 - 带边框和指定字体 ICellStyle style = getStyle(workbook); ICellStyle styleHeader = getStyle(workbook, 20, true, true); ICellStyle style12 = getStyle(workbook, 11, false, true); // 设置列宽(6列) sheet.SetColumnWidth(0, 4000); // 第一列稍宽 sheet.SetColumnWidth(1, 3000); sheet.SetColumnWidth(2, 3000); sheet.SetColumnWidth(3, 3000); sheet.SetColumnWidth(4, 3000); sheet.SetColumnWidth(5, 3000); sheet.SetColumnWidth(6, 3000); // 创建20行 for (int rowIndex = 0; rowIndex <= 6; rowIndex++) { IRow row = sheet.CreateRow(rowIndex); // 设置行高(所有行相同高度) row.HeightInPoints = rowHeight; // 创建6个单元格 for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row.CreateCell(colIndex); if (rowIndex == 0) cell.CellStyle = styleHeader; else cell.CellStyle = style; } } //这是表头 DataTable tb0 = dtSource.Tables[0]; DataRow row0 = tb0.Rows[0]; // 1. 第一行列合并 sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 6)); // 2. 第二行列合并 sheet.AddMergedRegion(new CellRangeAddress(1, 1, 0, 6)); // 第三行列合并 sheet.AddMergedRegion(new CellRangeAddress(2, 2, 5, 6)); // 3. 第4行中的2至6列合并 sheet.AddMergedRegion(new CellRangeAddress(3, 3, 1, 6)); // 4. 第5行中,2,3列合并,5,6列合并 sheet.AddMergedRegion(new CellRangeAddress(4, 4, 1, 2)); sheet.AddMergedRegion(new CellRangeAddress(4, 4, 4, 6)); //****合并好后开始赋值beg************** setCellVal(sheet, 0, 0, row0["title"].ToString()); setCellVal(sheet, 1, 0, row0["title2"].ToString() + row0["title3"].ToString()); setCellVal(sheet, 2, 0, "工单号"); setCellVal(sheet, 2, 1, row0["daaNo"].ToString()); setCellVal(sheet, 2, 2, "产品名称"); setCellVal(sheet, 2, 3, row0["itemName"].ToString()); setCellVal(sheet, 2, 4, "规格型号"); setCellVal(sheet, 2, 5, row0["itemModel"].ToString()); setCellVal(sheet, 3, 0, "本批唯一码"); setCellVal(sheet, 3, 1, row0["wyb"].ToString()); setCellVal(sheet, 4, 0, "首件唯一码"); setCellVal(sheet, 4, 1, row0["sjwym"].ToString()); setCellVal(sheet, 4, 3, "首样条形码"); setCellVal(sheet, 4, 4, row0["txm"].ToString()); setCellVal(sheet, 5, 0, "生产单位"); setCellVal(sheet, 5, 1, "生产车间"); setCellVal(sheet, 5, 2, row0["sccj"].ToString()); setCellVal(sheet, 5, 3, "批量"); setCellVal(sheet, 5, 4, row0["pl"].ToString()); setCellVal(sheet, 5, 5, "生产日期"); setCellVal(sheet, 5, 6, row0["scrq"].ToString()); string[] ary = { "项目", "技术/品质要求", "测试数据", "检验结果", "A", "B", "C" }; for (int i = 0; i < ary.Length; i++) { setCellVal(sheet, 6, i, ary[i]); } //从第7行开始,就是循环数据库 int _idx = 7; DataTable tb1 = dtSource.Tables[1]; foreach (DataRow rrr in tb1.Rows) { IRow row7 = sheet.CreateRow(_idx); row7.HeightInPoints = rowHeight; for (int i = 0; i < ary.Length; i++) { ICell cell7 = row7.CreateCell(i); cell7.CellStyle = style; cell7.SetCellValue(rrr[ary[i]].ToString()); } _idx++; } IRow row8 = sheet.CreateRow(_idx); row8.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row8.CreateCell(colIndex); cell.CellStyle = style12; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5)); setCellVal(sheet, _idx, 0, "综合判定"); setCellVal(sheet, _idx, 1, "合格"); _idx++; IRow row9 = sheet.CreateRow(_idx); row9.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row9.CreateCell(colIndex); cell.CellStyle = style; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 3)); sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 4, 6)); setCellVal(sheet, _idx, 1, "工艺 已确认:合格"); setCellVal(sheet, _idx, 4, "生产 已确认:合格"); sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx, 0, 0)); _idx++; IRow row10 = sheet.CreateRow(_idx); row10.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row10.CreateCell(colIndex); cell.CellStyle = style12; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5)); setCellVal(sheet, _idx, 0, "审核意见"); setCellVal(sheet, _idx, 1, "合格"); _idx++; IRow row11 = sheet.CreateRow(_idx); row11.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row11.CreateCell(colIndex); cell.CellStyle = style12; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 6)); setCellVal(sheet, _idx, 0, "首件填写,来料检验"); //****合并好后开始赋值end************** // 5. 第8到10行中的第一列应被合并 //sheet.AddMergedRegion(new CellRangeAddress(7, 9, 0, 0)); //// 6. 第17,18行中的第一列合并 //sheet.AddMergedRegion(new CellRangeAddress(16, 17, 0, 0)); //// 7. 第17行中的2,3,4,5列合并 //sheet.AddMergedRegion(new CellRangeAddress(16, 16, 1, 4)); //// 8. 第18行中的,2,3列合并,4,5,6列合并 //sheet.AddMergedRegion(new CellRangeAddress(17, 17, 1, 2)); //sheet.AddMergedRegion(new CellRangeAddress(17, 17, 3, 5)); //// 9. 第19行中的,列2,3,4合并 //sheet.AddMergedRegion(new CellRangeAddress(18, 18, 1, 3)); //// 10. 第20行中的列全部合并 //sheet.AddMergedRegion(new CellRangeAddress(19, 19, 0, 5)); //保存 using (var ms = new MemoryStream()) { using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { workbook.Write(ms); ms.Flush(); ms.Position = 0; var data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// 生成iqc /// /// public static void ExportIqc(DataSet dtSource, string strFileName) { //行高 int rowHeight = 25; //总列 int maxCols = 8; // 创建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建单元格样式 - 带边框和指定字体 ICellStyle style = getStyle(workbook); ICellStyle styleHeader = getStyle(workbook, 20, true, true); ICellStyle style12 = getStyle(workbook, 11, false, true); // 设置列宽(6列) sheet.SetColumnWidth(0, 3000); // 第一列稍宽 sheet.SetColumnWidth(1, 3000); sheet.SetColumnWidth(2, 3000); sheet.SetColumnWidth(3, 3000); sheet.SetColumnWidth(4, 3000); sheet.SetColumnWidth(5, 3000); sheet.SetColumnWidth(6, 3000); sheet.SetColumnWidth(7, 3000); // 创建9行 for (int rowIndex = 0; rowIndex <= 8; rowIndex++) { IRow row = sheet.CreateRow(rowIndex); // 设置行高(所有行相同高度) row.HeightInPoints = rowHeight; // 创建个单元格 for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row.CreateCell(colIndex); if (rowIndex == 1) cell.CellStyle = styleHeader; else cell.CellStyle = style; // 添加一些示例数据(可根据需要修改) cell.SetCellValue($"行{rowIndex + 1}列{colIndex + 1}"); } } //这是表头 DataTable tb0 = dtSource.Tables[0]; DataRow row0 = tb0.Rows[0]; //第一行列合并 sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 3)); sheet.AddMergedRegion(new CellRangeAddress(0, 0, 4, 7)); //第二行列合并 sheet.AddMergedRegion(new CellRangeAddress(1, 1, 0, 7)); //第三行列合并 sheet.AddMergedRegion(new CellRangeAddress(2, 2, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(2, 2, 2, 5)); //第4 sheet.AddMergedRegion(new CellRangeAddress(3, 3, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(3, 3, 2, 5)); //第5行 sheet.AddMergedRegion(new CellRangeAddress(4, 4, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(4, 4, 2, 5)); //抽样依据 sheet.AddMergedRegion(new CellRangeAddress(5, 5, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(5, 5, 2, 7)); ////6,7行抽样数合并 sheet.AddMergedRegion(new CellRangeAddress(6, 7, 4, 4)); sheet.AddMergedRegion(new CellRangeAddress(6, 7, 5, 5)); sheet.AddMergedRegion(new CellRangeAddress(6, 7, 6, 6)); sheet.AddMergedRegion(new CellRangeAddress(6, 7, 7, 7)); ////第8行标题行 sheet.AddMergedRegion(new CellRangeAddress(8, 8, 1, 5)); //****合并好后开始赋值beg************** setCellVal(sheet, 0, 0, row0["title"].ToString()); setCellVal(sheet, 0, 4, row0["title2"].ToString()); setCellVal(sheet, 1, 0, row0["title3"].ToString()); setCellVal(sheet, 2, 0, "物料名称"); setCellVal(sheet, 2, 2, row0["itemName"].ToString()); setCellVal(sheet, 2, 6, "物料编码"); setCellVal(sheet, 2, 7, row0["itemNo"].ToString()); setCellVal(sheet, 3, 0, "送货单位"); setCellVal(sheet, 3, 2, row0["shdw"].ToString()); setCellVal(sheet, 3, 6, "送检日期"); setCellVal(sheet, 3, 7, row0["sjrq"].ToString()); setCellVal(sheet, 4, 0, "型号规格"); setCellVal(sheet, 4, 2, row0["itemModel"].ToString()); setCellVal(sheet, 4, 6, "批量"); setCellVal(sheet, 4, 7, row0["pl"].ToString()); setCellVal(sheet, 5, 0, "抽样依据"); setCellVal(sheet, 5, 2, row0["cyyj"].ToString()); setCellVal(sheet, 6, 0, "AQL"); setCellVal(sheet, 6, 1, "CR"); setCellVal(sheet, 6, 2, "MA"); setCellVal(sheet, 6, 3, "MI"); setCellVal(sheet, 6, 4, "抽样数"); setCellVal(sheet, 6, 5, row0["cys"].ToString()); setCellVal(sheet, 6, 6, "不合格数"); setCellVal(sheet, 6, 7, row0["bhgs"].ToString()); setCellVal(sheet, 7, 0, "判定Ac/Re"); setCellVal(sheet, 7, 1, "0/1"); setCellVal(sheet, 7, 2, "0/1"); setCellVal(sheet, 7, 3, "0/1"); setCellVal(sheet, 8, 0, "项目"); setCellVal(sheet, 8, 1, "质量要求"); setCellVal(sheet, 8, 6, "检验记录"); setCellVal(sheet, 8, 7, "检验结果"); ////从第9行开始,就是循环数据库 int _idx = 9; DataTable tb1 = dtSource.Tables[1]; foreach (DataRow rrr in tb1.Rows) { IRow row7 = sheet.CreateRow(_idx); row7.HeightInPoints = rowHeight; for (int i = 0; i < maxCols; i++) { ICell cell7 = row7.CreateCell(i); cell7.CellStyle = style; // cell7.SetCellValue(rrr[ary[i]].ToString()); } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5)); setCellVal(sheet, _idx, 0, rrr["项目"].ToString()); setCellVal(sheet, _idx, 1, rrr["质量要求"].ToString()); setCellVal(sheet, _idx, 6, rrr["检验记录"].ToString()); setCellVal(sheet, _idx, 7, rrr["检验结果"].ToString()); _idx++; } //备注 IRow row8 = sheet.CreateRow(_idx); row8.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row8.CreateCell(colIndex); cell.CellStyle = style12; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 7)); setCellVal(sheet, _idx, 0, "备注:"); _idx++; //综合判定 for (int i = 0; i < 2; i++) { IRow row9 = sheet.CreateRow(_idx); row9.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row9.CreateCell(colIndex); cell.CellStyle = style; } _idx++; } sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 1, 0, 0)); sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 2, 1, 7)); sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx - 1, 1, 7)); setCellVal(sheet, _idx - 2, 0, "综合判定:"); setCellVal(sheet, _idx - 2, 1, row0["zhpd"].ToString()); setCellVal(sheet, _idx - 1, 1, row0["zhpdqz"].ToString()); //审核意见: for (int i = 0; i < 2; i++) { IRow row9 = sheet.CreateRow(_idx); row9.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row9.CreateCell(colIndex); cell.CellStyle = style; } _idx++; } sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 1, 0, 0)); sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 2, 1, 7)); sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx - 1, 1, 7)); setCellVal(sheet, _idx - 2, 0, "审核意见:"); setCellVal(sheet, _idx - 2, 1, row0["shyj"].ToString()); setCellVal(sheet, _idx - 1, 1, row0["shyjqz"].ToString()); string[] ary = { "采购部意见", "销售部意见", "技术部意见", "生产部意见", "品质部意见" }; for (int i = 0; i < ary.Length; i++) { IRow row9 = sheet.CreateRow(_idx); row9.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row9.CreateCell(colIndex); cell.CellStyle = style; } // sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 2, 7)); _idx++; } setCellVal(sheet, _idx - ary.Length, 0, "不合格评审:"); sheet.AddMergedRegion(new CellRangeAddress(_idx - ary.Length, _idx - 1, 0, 0)); for (int i = 0; i < ary.Length; i++) { setCellVal(sheet, _idx - i - 1, 1, ary[i]); setCellVal(sheet, _idx - i - 1, 2, "□ 同意 □ 不同意 签名/日期:"); } //****合并好后开始赋值end************** //保存 using (var ms = new MemoryStream()) { using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { workbook.Write(ms); ms.Flush(); ms.Position = 0; var data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// 生成巡检 /// /// public static void ExportXunJian(DataSet dtSource, string strFileName) { DataTable tb0 = dtSource.Tables[0]; DataRow row0 = tb0.Rows[0]; DataTable tb1 = dtSource.Tables[1]; //行高 int rowHeight = 25; //总列 int maxCols = tb1.Columns.Count; HSSFWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建单元格样式 - 带边框和指定字体 ICellStyle style = getStyle(workbook); ICellStyle styleHeader = getStyle(workbook, 20, true, true); ICellStyle style12 = getStyle(workbook, 11, false, true); // 设置列宽(6列) sheet.SetColumnWidth(0, 3000); // 第一列稍宽 sheet.SetColumnWidth(1, 3000); sheet.SetColumnWidth(2, 3000); sheet.SetColumnWidth(3, 3000); sheet.SetColumnWidth(4, 3000); sheet.SetColumnWidth(5, 3000); sheet.SetColumnWidth(6, 3000); sheet.SetColumnWidth(7, 3000); // 创建行 for (int rowIndex = 0; rowIndex <= 1; rowIndex++) { IRow row = sheet.CreateRow(rowIndex); // 设置行高(所有行相同高度) row.HeightInPoints = rowHeight; // 创建个单元格 for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row.CreateCell(colIndex); if (rowIndex == 0) cell.CellStyle = styleHeader; else cell.CellStyle = style; } } //第一行列合并 sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 7)); setCellVal(sheet, 0, 0, row0["title"].ToString()); //循环数据库 int _idx = 1; IRow row6 = sheet.CreateRow(_idx); for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell6 = row6.CreateCell(colIndex); cell6.CellStyle = style; cell6.SetCellValue(tb1.Columns[colIndex].Caption.ToString().Trim()); } _idx++; foreach (DataRow rrr in tb1.Rows) { IRow row7 = sheet.CreateRow(_idx); row7.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < tb1.Columns.Count; colIndex++) { ICell cell7 = row7.CreateCell(colIndex); cell7.CellStyle = style; cell7.SetCellValue(rrr[tb1.Columns[colIndex]].ToString()); } _idx++; } //备注 IRow row8 = sheet.CreateRow(_idx); row8.HeightInPoints = rowHeight; for (int colIndex = 0; colIndex < maxCols; colIndex++) { ICell cell = row8.CreateCell(colIndex); cell.CellStyle = style12; } sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 2)); setCellVal(sheet, _idx, 0, "巡检人:"); for (int colIndex = 2; colIndex < tb1.Columns.Count; colIndex++) { setCellVal(sheet, _idx, colIndex, "余吉林"); } //保存 using (var ms = new MemoryStream()) { using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { workbook.Write(ms); ms.Flush(); ms.Position = 0; var data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// Excel导入成Datable /// /// 导入路径(包含文件名与扩展名) /// public static DataTable ExcelToTable(string file) { var dt = new DataTable(); IWorkbook workbook; var fileExt = Path.GetExtension(file).ToLower(); using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式 if (fileExt == ".xlsx") workbook = new XSSFWorkbook(fs); else if (fileExt == ".xls") workbook = new HSSFWorkbook(fs); else workbook = null; if (workbook == null) return null; // int numberOfSheets = SXSSFWorkbook.getNumberOfSheets(); var numberOfSheets = workbook.NumberOfSheets; //获取表的数量 var sheet = workbook.GetSheetAt(0); //表头 var header = sheet.GetRow(sheet.FirstRowNum + 1); var columns = new List(); for (var i = 0; i < header.LastCellNum; i++) { var obj = GetValueType(header.GetCell(i)); if (obj == null || obj.ToString() == string.Empty) dt.Columns.Add(new DataColumn("Columns" + i)); else dt.Columns.Add(new DataColumn(obj.ToString().Trim())); columns.Add(i); } for (var act = 0; act < numberOfSheets; act++) { var _sheet = workbook.GetSheetAt(act); //数据 for (var i = _sheet.FirstRowNum + 1 + 1; i <= _sheet.LastRowNum; i++) { var dr = dt.NewRow(); var hasValue = false; foreach (var j in columns) { dr[j] = GetValueType(_sheet.GetRow(i).GetCell(j)); if (dr[j] != null && dr[j].ToString() != string.Empty) hasValue = true; } if (hasValue) dt.Rows.Add(dr); } } } return dt; } /// /// 获取单元格类型 /// /// /// private static object GetValueType(ICell cell) { if (cell == null) return null; switch (cell.CellType) { case CellType.Blank: //BLANK: return null; case CellType.Boolean: //BOOLEAN: return cell.BooleanCellValue; case CellType.Numeric: //NUMERIC: return cell.NumericCellValue; case CellType.String: //STRING: return cell.StringCellValue.Trim(); case CellType.Error: //ERROR: return cell.ErrorCellValue; case CellType.Formula: //FORMULA: default: return "=" + cell.CellFormula; } } }