| | |
| | | { |
| | | 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++) |
| | | { |
| | |
| | | .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) |
| | | const int maxRowsPerXlsSheet = 65535; // HSSF 的单表行数上限(索引从0) |
| | | int headerRowsCount = roct + 1; // aryHeader 行数 + 列头行 |
| | | int rowsPerSheet = maxRowsPerXlsSheet - headerRowsCount; |
| | | if (rowsPerSheet <= 0) rowsPerSheet = 1; |
| | | |
| | | int totalRows = dtSource.Rows.Count; |
| | | int sheetIndex = 0; |
| | | ISheet sheet = null; |
| | | ICellStyle headStyle = null; |
| | | |
| | | // 分片写入,每片写入 header + 数据 |
| | | for (int startRow = 0; startRow < totalRows; startRow += rowsPerSheet) |
| | | { |
| | | headerRow.CreateCell(column.Ordinal) |
| | | .SetCellValue(column.ColumnName); |
| | | headerRow.GetCell(column.Ordinal).CellStyle = headStyle; |
| | | sheet.SetColumnWidth(column.Ordinal, |
| | | (arrColWidth[column.Ordinal] + 6) * 256); |
| | | sheet = workbook.CreateSheet("Sheet" + (sheetIndex + 1)); |
| | | |
| | | // 创建并应用列宽(每个 sheet 都需要) |
| | | for (int c = 0; c < dtSource.Columns.Count; c++) |
| | | { |
| | | sheet.SetColumnWidth(c, (arrColWidth[c] + 6) * 256); |
| | | } |
| | | |
| | | // 写入 aryHeader(多行合并显示) |
| | | var cusRow = sheet.CreateRow(0); |
| | | var _rr = 0; |
| | | foreach (string _hh in aryHeader) |
| | | { |
| | | cusRow = sheet.CreateRow(_rr); |
| | | cusRow.CreateCell(0).SetCellValue(_hh); |
| | | sheet.AddMergedRegion(new CellRangeAddress(_rr, _rr, 0, |
| | | dtSource.Columns.Count - 1)); |
| | | _rr++; |
| | | } |
| | | |
| | | // 填充表头 |
| | | var headerRow = sheet.CreateRow(roct); |
| | | 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); |
| | | for (int colIdx = 0; colIdx < dtSource.Columns.Count; colIdx++) |
| | | { |
| | | headerRow.CreateCell(colIdx).SetCellValue(dtSource.Columns[colIdx].ColumnName); |
| | | headerRow.GetCell(colIdx).CellStyle = headStyle; |
| | | } |
| | | |
| | | // 写入数据段 |
| | | int endRow = Math.Min(startRow + rowsPerSheet, totalRows); |
| | | for (int i = startRow; i < endRow; i++) |
| | | { |
| | | var dataRow = sheet.CreateRow((i - startRow) + roct + 1); |
| | | for (var j = 0; j < dtSource.Columns.Count; j++) |
| | | { |
| | | dataRow.CreateCell(j) |
| | | .SetCellValue(dtSource.Rows[i][j].ToString()); |
| | | } |
| | | } |
| | | |
| | | sheetIndex++; |
| | | } |
| | | |
| | | //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++) |
| | | // 填充 footer(只写在最后一个 sheet 上) |
| | | if (aryFotter != null && aryFotter.Count > 0 && sheet != null) |
| | | { |
| | | 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 lastSheet = sheet; |
| | | var _rot = roct + (totalRows - ((sheetIndex - 1) * rowsPerSheet)) + 1; |
| | | if (_rot <= roct) _rot = roct + 1; |
| | | var ftRow = lastSheet.CreateRow(_rot); |
| | | var _ftidx = 0; |
| | | var _ftw = dtSource.Columns.Count / 2; |
| | | foreach (string _hh in aryFotter) |
| | |
| | | ftStyle.BorderBottom = BorderStyle.Thin; |
| | | else |
| | | ftStyle.BorderBottom = BorderStyle.None; |
| | | ftRow = sheet.CreateRow(_rot); |
| | | |
| | | ftRow = lastSheet.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()); |
| | | lastSheet.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, |
| | | lastSheet.AddMergedRegion(new CellRangeAddress(_rot, _rot, _ftw, |
| | | dtSource.Columns.Count - 1)); |
| | | for (var c = 0; c < dtSource.Columns.Count; c++) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | //保存 |
| | | // 保存 |
| | | using (var ms = new MemoryStream()) |
| | | { |
| | | using (var fs = new FileStream(strFileName, FileMode.Create, |