| | |
| | | import com.ruoyi.common.utils.file.ImageUtils; |
| | | import com.ruoyi.common.utils.reflect.ReflectUtils; |
| | | import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; |
| | | import org.apache.poi.hssf.usermodel.*; |
| | | import org.apache.poi.ss.usermodel.*; |
| | | import org.apache.poi.ss.util.CellRangeAddress; |
| | | import org.apache.poi.ss.util.CellRangeAddressList; |
| | | import org.apache.poi.hssf.usermodel.HSSFClientAnchor; |
| | | import org.apache.poi.hssf.usermodel.HSSFDataValidation; |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| | | import org.apache.poi.hssf.usermodel.HSSFClientAnchor; |
| | | import org.apache.poi.hssf.usermodel.HSSFDataValidation; |
| | |
| | | if(index == 1) { |
| | | // 合并第一行的前5个单元格 |
| | | sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6)); |
| | | // 获取页面设置 |
| | | // 必须先设置为true |
| | | // 页面布局设置 |
| | | sheet.setAutobreaks(true); |
| | | sheet.setFitToPage(true); |
| | | |
| | | // 创建行并设置高度 |
| | | // 获取打印设置 |
| | | PrintSetup printSetup = sheet.getPrintSetup(); |
| | | |
| | | // 设置为1页宽度 |
| | | printSetup.setFitWidth((short) 1); // 宽度调整为1页 |
| | | printSetup.setFitHeight((short) 0); // 高度不限制 |
| | | |
| | | // 其他打印设置 |
| | | printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE); // A4纸 |
| | | printSetup.setLandscape(false); // 纵向打印 |
| | | |
| | | // 设置页边距 |
| | | sheet.setMargin(Sheet.LeftMargin, 0.5); |
| | | sheet.setMargin(Sheet.RightMargin, 0.5); |
| | | // 设置打印区域,从第0行到第1000行,第0列到第20列(根据实际情况调整) |
| | | // sheet.setPrintArea(0, 0, 20, 0, 1000); |
| | | // 如果是index为1的sheet,设置顶端标题行 |
| | | |
| | | // 将第1行(索引为0)设置为每页重复的标题行 |
| | | sheet.setRepeatingRows(CellRangeAddress.valueOf("$1:$4")); |
| | | row = sheet.createRow(0); |
| | | row.setHeight((short)(30 *30)); |
| | | row.setHeight((short) (37*20)); |
| | | |
| | | // 创建单元格并添加图片 |
| | | Cell cell = row.createCell(0); |
| | |
| | | // if (Files.exists(Paths.get(imagePath))) { |
| | | // byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath)); |
| | | // 将byte数组转换成inputstream,以便插入到Excel中 |
| | | ClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 5), |
| | | ClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 100, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 5), |
| | | cell.getRow().getRowNum() + 1); |
| | | // 设置锚点类型为MOVE_AND_RESIZE,使图片可以随单元格调整大小 |
| | | anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); |
| | | // 计算居中位置 |
| | | int col1 = 3; // 中间列 |
| | | int col2 = col1 + 2; |
| | |
| | | anchor.setCol2(col2); |
| | | anchor.setRow1(0); |
| | | anchor.setRow2(1); |
| | | // anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); |
| | | // anchor.set |
| | | // anchor.setHorizontallyCenter(true); |
| | | |
| | |
| | | // log.error("添加图片失败: {}", e.getMessage()); |
| | | // } |
| | | row = sheet.createRow(1); |
| | | row.setHeight((short) (32.5*20)); |
| | | sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 6)); |
| | | Cell titleCell = row.createCell(0); |
| | | titleCell.setCellValue("卷 内 目 录"); |
| | | titleCell.setCellValue("卷 内 目 录"); |
| | | // 设置加粗、宋体、18号字体和居中样式 |
| | | CellStyle style = wb.createCellStyle(); |
| | | Font font = wb.createFont(); |
| | |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | titleCell.setCellStyle(style); |
| | | row = sheet.createRow(2); |
| | | row.setHeight((short) (20*20)); |
| | | // |
| | | row.createCell(4).setCellValue("档号:"); |
| | | Cell dnumCell = row.createCell(4); |
| | | dnumCell.setCellValue("档号:"); |
| | | // 设置加粗、宋体、18号字体和居中样式 |
| | | CellStyle style1 = wb.createCellStyle(); |
| | | Font font1 = wb.createFont(); |
| | | font1.setBold(true); |
| | | font1.setFontName("宋体"); |
| | | font1.setFontHeightInPoints((short) 12); |
| | | style1.setFont(font1); |
| | | style1.setAlignment(HorizontalAlignment.RIGHT); |
| | | dnumCell.setCellStyle(style1); |
| | | // row.createCell(4).setCellValue("档号:"); |
| | | //拿到档号 |
| | | String recordId = list.get(index).getRecordId(); |
| | | row.createCell(5).setCellValue(recordId); |
| | | // 创建带有下划线样式的单元格 |
| | | Cell recordIdCell = row.createCell(5); |
| | | recordIdCell.setCellValue(recordId); |
| | | // 创建下划线样式 |
| | | CellStyle underlineStyle = wb.createCellStyle(); |
| | | Font underlineFont = wb.createFont(); |
| | | underlineFont.setFontName("宋体"); |
| | | underlineFont.setFontHeightInPoints((short) 11); |
| | | underlineFont.setUnderline(Font.U_SINGLE); // 设置下划线 |
| | | underlineStyle.setFont(underlineFont); |
| | | recordIdCell.setCellStyle(underlineStyle); |
| | | row = sheet.createRow(3); |
| | | |
| | | row.setHeight((short) (17.5*20)); |
| | | row = sheet.createRow(4); |
| | | // // 添加总页数和当前页码信息 |
| | | // row.createCell(5).setCellValue("总页数: " + list.size() + ", 当前页: " + (index + 1)); |
| | | // row = sheet.createRow(4); |
| | |
| | | // int endNo = Math.min(startNo + sheetSize, list.size()); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | if(index==1) |
| | | row = sheet.createRow(i + 4 ); |
| | | row = sheet.createRow(i + 5 ); |
| | | else |
| | | row = sheet.createRow(i + 1 ); |
| | | // 得到导出对象. |
| | |
| | | style.setWrapText(true); |
| | | Font dataFont = wb.createFont(); |
| | | dataFont.setFontName("Arial"); |
| | | dataFont.setFontHeightInPoints((short) 10); |
| | | dataFont.setFontHeightInPoints((short) 12); |
| | | style.setFont(dataFont); |
| | | styles.put("data", style); |
| | | |
| | |
| | | style.setWrapText(true); |
| | | Font headerFont = wb.createFont(); |
| | | headerFont.setFontName(excel.headerFontName()); |
| | | headerFont.setFontHeightInPoints((short) 10); |
| | | headerFont.setFontHeightInPoints((short) 12); |
| | | headerFont.setBold(excel.headerFontBold()); |
| | | headerFont.setColor(excel.headerColor().index); |
| | | style.setFont(headerFont); |
| | |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | Font totalFont = wb.createFont(); |
| | | totalFont.setFontName("Arial"); |
| | | totalFont.setFontHeightInPoints((short) 10); |
| | | totalFont.setFontHeightInPoints((short) 12); |
| | | style.setFont(totalFont); |
| | | // 总计行也设置自动换行 |
| | | style.setWrapText(true); |
| | |
| | | } else { |
| | | wb.setSheetName(index, sheetName + index); |
| | | } |
| | | // 设置页面属性 |
| | | sheet.setFitToPage(true); |
| | | PrintSetup printSetup = sheet.getPrintSetup(); |
| | | printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE); // 设置为A4纸张 |
| | | printSetup.setLandscape(false); // 纵向打印 |
| | | printSetup.setFitWidth((short) 1); // 宽度调整为1页 |
| | | printSetup.setFitHeight((short) 0); // 0表示高度不限制页数(自动) |
| | | // 设置页边距 |
| | | sheet.setMargin(Sheet.TopMargin, 1.0); // 增加顶部边距以容纳页眉 |
| | | sheet.setMargin(Sheet.BottomMargin, 0.5); |
| | | sheet.setMargin(Sheet.LeftMargin, 0.5); |
| | | sheet.setMargin(Sheet.RightMargin, 0.5); |
| | | sheet.setMargin(Sheet.HeaderMargin, 0.5); // 设置页眉边距 |
| | | sheet.setMargin(Sheet.FooterMargin, 0.5); // 设置页脚边距 |
| | | // 设置打印区域,从第0行到第1000行,第0列到第20列(根据实际情况调整) |
| | | //sheet.setPrintArea(0, 0, 20, 0, 1000); |
| | | // 设置页眉,显示总页数和当前页码 |
| | | if (wb instanceof HSSFWorkbook) { |
| | | HSSFWorkbook hssfWb = (HSSFWorkbook) wb; |
| | | HSSFSheet hssfSheet = hssfWb.getSheetAt(index); |
| | | HSSFHeader header = hssfSheet.getHeader(); |
| | | // 设置页眉字体 |
| | | // header.setFontName("宋体"); |
| | | // header.setFontSize((short) 10); |
| | | // 设置页眉内容 |
| | | hssfSheet.setMargin(Sheet.HeaderMargin, 0.5); |
| | | header.setRight("总页数: &P, 当前页: &N"); |
| | | // 设置页眉左对齐和右对齐内容(可选) |
| | | header.setLeft("文档标题"); |
| | | header.setRight("&D &T"); // 日期和时间 |
| | | } |
| | | // 如果是index为1的sheet,设置顶端标题行 |
| | | if (index == 1) { |
| | | // 将第1行(索引为0)设置为每页重复的标题行 |
| | | sheet.setRepeatingRows(CellRangeAddress.valueOf("$1:$4")); |
| | | } |
| | | } |
| | | /** |
| | | * 创建工作表 |
| | |
| | | this.sheet = wb.createSheet(); |
| | | this.styles = createStyles(wb); |
| | | wb.setSheetName(index, sheetName); |
| | | // 获取页面设置 |
| | | // 必须先设置为true |
| | | sheet.setFitToPage(true); |
| | | PrintSetup printSetup = sheet.getPrintSetup(); |
| | | printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE); // 设置为A4纸张 |
| | | printSetup.setLandscape(false); // 纵向打印 |
| | | printSetup.setFitWidth((short) 1); // 宽度调整为1页 |
| | | printSetup.setFitHeight((short) 0); // 0表示高度不限制页数(自动) |
| | | // 设置页边距 |
| | | sheet.setMargin(Sheet.TopMargin, 1.0); // 增加顶部边距以容纳页眉 |
| | | sheet.setMargin(Sheet.BottomMargin, 0.5); |
| | | sheet.setMargin(Sheet.LeftMargin, 0.5); |
| | | sheet.setMargin(Sheet.RightMargin, 0.5); |
| | | sheet.setMargin(Sheet.HeaderMargin, 0.5); // 设置页眉边距 |
| | | sheet.setMargin(Sheet.FooterMargin, 0.5); // 设置页脚边距 |
| | | // 设置打印区域,从第0行到第1000行,第0列到第20列(根据实际情况调整) |
| | | // sheet.setPrintArea(0, 0, 20, 0, 1000); |
| | | // 设置页眉,显示总页数和当前页码 |
| | | if (wb instanceof HSSFWorkbook) { |
| | | HSSFWorkbook hssfWb = (HSSFWorkbook) wb; |
| | | HSSFSheet hssfSheet = hssfWb.getSheetAt(index); |
| | | HSSFHeader header = hssfSheet.getHeader(); |
| | | // 设置页眉字体 |
| | | // header.setFontName("宋体"); |
| | | // header.setFontSize((short) 10); |
| | | // 设置页眉内容 |
| | | hssfSheet.setMargin(Sheet.HeaderMargin, 2.1); |
| | | header.setRight("共 &N 页 第 &P页"); |
| | | } |
| | | // 如果是index为1的sheet,设置顶端标题行 |
| | | if (index == 1) { |
| | | // 将第1行(索引为0)设置为每页重复的标题行 |
| | | sheet.setRepeatingRows(CellRangeAddress.valueOf("$1:$3")); |
| | | } |
| | | } |
| | | /** |
| | | * 获取单元格值 |
| | |
| | | } |
| | | return val; |
| | | } |
| | | } |
| | | } |