产品经理新需求!要求导出类似检查记录的模板表格下面是已经做好的表格

下面讲一讲如何实现
1,依赖导入

            <!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

2,直接上代码吧

 @RequestMapping("/excel1")public void excel1(HttpServletResponse response) throws IOException {//创建HSSFWorkbook对象(excel的文档对象)HSSFWorkbook wb = new HSSFWorkbook();//建立新的sheet对象(excel的表单)HSSFSheet sheet=wb.createSheet("检查记录模板导出");//在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个HSSFRow row1=sheet.createRow(0);// 设置行高row1.setHeight((short)(12*90));//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个HSSFCell cell=row1.createCell(0);// todo 开头标题//设置单元格内容cell.setCellValue("上海市浦东新区防雷安全执法检查记录表");//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列sheet.addMergedRegion(new CellRangeAddress(0,0,0,13));HSSFCellStyle format = getFormat(wb, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, true, (short) 22);cell.setCellStyle(format);//todo 第二行HSSFCellStyle cellStyle1 = getFormat(wb, HorizontalAlignment.LEFT, VerticalAlignment.CENTER, true, (short) 11);HSSFRow row2 = getTitleStyle(sheet, cellStyle1, 1, 12 * 45, 0, "检查单位:", 1, 1, 0, 1,true,false);getContentStyle(sheet, row2, cellStyle1, 3, "", 1,1,2,9, true,false);getContentStyle(sheet, row2, cellStyle1, 10, "编号:", 1,1,10,11,true, false);getContentStyle(sheet, row2, cellStyle1, 12, "", 1,1,12,13,true, false);//todo 第三行HSSFRow row3 = getTitleStyle(sheet, cellStyle1, 2, 12 * 45, 0, "(加盖公章):", 2, 2, 0, 1,true,false);getContentStyle(sheet, row3, cellStyle1, 3, "", 2,2,2,9,true, false);getContentStyle(sheet, row3, cellStyle1, 10, "流水号:", 2,2,10,11,true, false);getContentStyle(sheet, row3, cellStyle1, 12, "", 2,2,12,13,true, false);// todo 第四行 (标题一)HSSFCellStyle cellStyle2 = getFormat(wb, HorizontalAlignment.LEFT, VerticalAlignment.CENTER, true, (short) 11);cellStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND);cellStyle2.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());HSSFRow row4 = getTitleStyle(sheet, cellStyle2, 3, 12 * 35, 0, "一,被检查对象和地址", 3, 3, 0, 13, true,true);// todo 第五行HSSFRow row5 = getTitleStyle(sheet, cellStyle1, 4, 12 * 30, 0, "单位名称(全称):", 4, 4, 0, 2,true, true);getContentStyle(sheet, row5, cellStyle1, 4, "", 4,4,3,9, true,true);getContentStyle(sheet, row5, cellStyle1, 10, "法定代表人:", 4,4,10,11, true,true);getContentStyle(sheet, row5, cellStyle1, 12, "", 4,4,12,13, true,true);// todo 第六行HSSFRow row6 = getTitleStyle(sheet, cellStyle1, 5, 12 * 30, 0, "检查地址:", 5, 5, 0, 2, true,true);getContentStyle(sheet, row6, cellStyle1, 4, "", 5,5,3,13, true,true);// todo 第七行 (标题二)HSSFRow row7 = getTitleStyle(sheet, cellStyle2, 6, 12 * 35, 0, "二,检查内容和结果", 6, 6, 0, 13, true,true);// todo 第八行HSSFCellStyle cellStyle8 = getFormat(wb, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, true, (short) 11);HSSFRow row8 = getTitleStyle(sheet, cellStyle8, 7, 12 * 30, 0, "✓   现场检查", 7, 7, 0, 3, true,true);getContentStyle(sheet, row8, cellStyle8, 4, "□   书面检查", 7,7,4,7, true,true);getContentStyle(sheet, row8, cellStyle8, 8, "□   其他方式:", 7,7,8,10, true,true);getContentStyle(sheet, row8, cellStyle8, 11, "", 7,7,11,13, true,true);// todo 第九行(标题3)HSSFRow row9 = getTitleStyle(sheet, cellStyle2, 8, 12 * 35, 0, "三,检查内容和结果", 8, 8, 0, 13, true,true);// todo 第十行HSSFCellStyle cellStyle10 = getFormat(wb, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, true, (short) 11);// 自动换行cellStyle10.setWrapText(true);HSSFRow row10 = getTitleStyle(sheet, cellStyle10, 9, 0, 0, "建筑物防雷装置检测情况", 9, 18, 0, 1, true,true);// 项目名称单独处理HSSFCell cell103 = row10.createCell(2);row9.setHeight((short)(12*30));cell103.setCellValue("1.项目名称:");cell103.setCellStyle(cellStyle1);sheet.addMergedRegion(new CellRangeAddress(9,9,2,4));sheet.addMergedRegion(new CellRangeAddress(9,9,5,13));setBorderStyle(sheet, new CellRangeAddress(9,9,2,4));setBorderStyle(sheet, new CellRangeAddress(9,9,5,13));// todo 第十一行HSSFRow row11 = getTitleStyle(sheet, cellStyle1, 10, 12 * 30, 2, "2.建筑物使用单位性质:", 10, 10, 2, 4, true,true);getContentStyle(sheet, row11, cellStyle8, 5, "□ 消防重点单位", 10,10,5,6, true,true);getContentStyle(sheet, row11, cellStyle8, 7, "✓ 安全生产重点单位", 10,10,7,9, true,true);getContentStyle(sheet, row11, cellStyle8, 10, "□ 气象灾害防御重点单位", 10,10,10,12, true,true);// 边框单独处理HSSFCell cell118 = row11.createCell(13);cell118.setCellValue("□ 其他");cell118.setCellStyle(cellStyle8);setBorderStyle(sheet, new CellRangeAddress(10,10,13,13));// todo 第十二行HSSFRow row12 = getTitleStyle(sheet, cellStyle1, 11, 12 * 30, 2, "建筑物防雷分类:", 11, 11, 2, 4, true,true);getContentStyle(sheet, row12, cellStyle8, 5, "□ 第一类", 11,11,5,7, true,true);getContentStyle(sheet, row12, cellStyle8, 8, "□ 第二类", 11,11,8,10, true,true);getContentStyle(sheet, row12, cellStyle8, 11, "□ 第三类", 11,11,11,13, true,true);// todo 第十三行HSSFRow row13 = getTitleStyle(sheet, cellStyle1, 12, 12 * 30, 2, "2.建筑物使用情况:", 12, 12, 2, 4, true,true);getContentStyle(sheet, row13, cellStyle8, 5, "□ 新建,改建扩建项目", 12,12,5,9, true,true);getContentStyle(sheet, row13, cellStyle8, 10, "□ 已投入使用项目", 12,12,10,13, true,true);// todo 第十四行HSSFRow row14 = getTitleStyle(sheet, cellStyle1, 13, 12 * 30, 2, "3.建(构)筑物,场所或设施是否安装有防雷装置:", 13, 13, 2, 7, true,true);getContentStyle(sheet, row14, cellStyle8, 8, "□ 是", 13,13,8,10, true,true);getContentStyle(sheet, row14, cellStyle8, 11, "□ 否", 13,13,11,13, true,true);// todo 第十五行HSSFRow row15 = getTitleStyle(sheet, cellStyle1, 14, 12 * 30, 2, "4.是否有专人负责防雷装置的日常维护工作:", 14, 14, 2, 7, true,true);getContentStyle(sheet, row15, cellStyle8, 8, "□ 是", 14,14,8,10, true,true);getContentStyle(sheet, row15, cellStyle8, 11, "□ 否", 14,14,11,13, true,true);// todo 第十六行HSSFRow row16 = getTitleStyle(sheet, cellStyle1, 15, 12 * 30, 2, "5.是否遭受过雷电灾害:", 15, 15, 2, 4, true,true);getContentStyle(sheet, row16, cellStyle8, 5, "□ 是", 15,15,5,6, true,true);getContentStyle(sheet, row16, cellStyle8, 7, "□ 否", 15,15,7,8, true,true);getContentStyle(sheet, row16, cellStyle8, 9, "是否及时报告:", 15,15,9,11, true,true);getContentStyle(sheet, row16, cellStyle8, 12, "□ 是", 15,15,12,12, false,true);getContentStyle(sheet, row16, cellStyle8, 13, "□ 否", 15,15,13,13, false,true);// todo 第十七行HSSFRow row17 = getTitleStyle(sheet, cellStyle1, 16, 12 * 30, 2, "6.是否已按规定完成本年度定期防雷装置检查:", 16, 16, 2, 7, true,true);getContentStyle(sheet, row17, cellStyle8, 8, "□ 是", 16,16,8,10, true,true);getContentStyle(sheet, row17, cellStyle8, 11, "□ 否", 16,16,11,13, true,true);// todo 第十八行HSSFRow row18 = getTitleStyle(sheet, cellStyle1, 17, 12 * 30, 2, "7.检测单位是否具有防雷装置检测资质:", 17, 17, 2, 7, true,true);getContentStyle(sheet, row18, cellStyle8, 8, "□ 是", 17,17,8,10, true,true);getContentStyle(sheet, row18, cellStyle8, 11, "□ 否", 17,17,11,13, true,true);// todo 第十九行HSSFRow row19 = getTitleStyle(sheet, cellStyle1, 18, 12 * 30, 2, "8.是否存在检测不合格项目:", 18, 18, 2, 4, true,true);getContentStyle(sheet, row19, cellStyle8, 5, "□ 是", 18,18,5,6, true,true);getContentStyle(sheet, row19, cellStyle8, 7, "□ 否", 18,18,7,8, true,true);getContentStyle(sheet, row19, cellStyle8, 9, "是否已整改:", 18,18,9,11, true,true);getContentStyle(sheet, row19, cellStyle8, 12, "□ 是", 18,18,12,12, false,true);getContentStyle(sheet, row19, cellStyle8, 13, "□ 否", 18,18,13,13, false,true);// todo 第二十行HSSFRow row20 = getTitleStyle(sheet, cellStyle10, 19, 12 * 60, 0, "其他情况", 19, 19, 0, 1, true,true);getContentStyle(sheet, row20, cellStyle1, 2, "", 19,19,2,13, true,true);// todo 第二十一行(标题四)HSSFRow row21 = getTitleStyle(sheet, cellStyle2, 20, 12 * 35, 0, "四,处理结果", 20, 20, 0, 13, true,true);// todo 第二十二和二十三行HSSFRow row22 = getTitleStyle(sheet, cellStyle1, 21, 12 * 30, 0, "1,□ 正常,未发现违规行为。", 21, 21, 0, 13, true,true);HSSFRow row23 = getTitleStyle(sheet, cellStyle1, 22, 12 * 30, 0, "2,□ 责令改正违法行为:", 22, 22, 0, 6, true,true);getContentStyle(sheet, row23, cellStyle1, 7, "", 22,22,7,13, true,true);// todo 第二十四行HSSFRow row24 = getTitleStyle(sheet, cellStyle1, 23, 12 * 30, 0, "□ 要求", 23, 23, 0, 1, true,true);getContentStyle(sheet, row24, cellStyle1, 2, "", 23,23,2,5, true,true);getContentStyle(sheet, row24, cellStyle1, 6, "办理年度防雷装置检测工作。", 23,23,6,13, true,true);// todo 第二十五行HSSFRow row25 = getTitleStyle(sheet, cellStyle1, 24, 12 * 40, 0, "其他处理:", 24, 24, 0, 13, true,true);// todo 第二十六行cellStyle2.setWrapText(true);HSSFRow row26 = getTitleStyle(sheet, cellStyle2, 25, 12 * 65, 0, "被检查单位(个人)签名", 25, 25, 0, 1, true,true);getContentStyle(sheet, row26, cellStyle1, 3, "", 25,25,2,6, true,true);getContentStyle(sheet, row26, cellStyle2, 7, "联系电话:", 25,25,7,8, true,true);getContentStyle(sheet, row26, cellStyle1, 9, "", 25,25,9,13, true,true);// todo 第二十七行HSSFRow row27 = getTitleStyle(sheet, cellStyle2, 26, 12 * 30, 0, "执法检查人员签名", 26, 28, 0, 1, true,true);getContentStyle(sheet, row27, cellStyle1, 2, "", 26,28,2,6, true,true);getContentStyle(sheet, row27, cellStyle2, 7, "联系电话:", 26,26,7,8, true,true);
//        getTitleStyle(sheet, cellStyle2, 26, 12 * 30, 7,"联系电话:",26,26,7,8, true,true);getTitleStyle(sheet, cellStyle2, 27, 12 * 30, 7,"检查时间:",27,28,7,8, true,true);
//        getContentStyle(sheet, row27, cellStyle2, 7, "联系电话1:", 26,26,7,8, true,true);
//        getContentStyle(sheet, row27, cellStyle2, 7, "检查时间1:", 27,28,7,8, true,true);getContentStyle(sheet, row27, cellStyle1, 9, "", 26,26,9,13, true,true);getContentStyle(sheet, row27, cellStyle1, 9, "", 27,28,9,13, true,true);// todo 第二十八行HSSFRow row28 = getTitleStyle(sheet, cellStyle2, 29, 12 * 65, 0, "备   注", 29, 29, 0, 1, true,true);getContentStyle(sheet, row28, cellStyle1, 2, "", 29,29,2,13, true,true);// todo 尾页HSSFRow row29 = getTitleStyle(sheet, cellStyle8, 30, 12 * 45, 0, "注:带'□'的项目根据实际情况划'✓',不涉及项目用'——'划去。", 30, 30, 0, 13, true,false);HSSFRow row30 = getTitleStyle(sheet, cellStyle8, 31, 12 * 45, 0, "两联复写:第一联承办单位留存,第二联交当事人,此联是承办单位留存联。", 31, 31, 0, 13, true,false);//输出Excel文件OutputStream output=response.getOutputStream();response.reset();response.setHeader("Content-disposition", "attachment; filename=details.xls");response.setContentType("application/msexcel");wb.write(output);output.close();}/*** 通用标题样式* @param sheet HSSFSheet* @param cellStyle HSSFCellStyle* @param rows 第几排* @param size 格子大小* @param column 第几行* @param message 内容* @param firstRow 起始行* @param lastRow 截至行* @param firstCol 起始列* @param lastCol 截至列* @param col 是否加边框* @param merge 是否合并单元格* @return*/public static HSSFRow getTitleStyle(HSSFSheet sheet, HSSFCellStyle cellStyle, int rows, int size, int column, String message, int firstRow, int lastRow, int firstCol, int lastCol,boolean merge, boolean col){// 得到行HSSFRow row=sheet.createRow(rows);// 格式大小if (size != 0){row.setHeight((short)(size));}// 从第几行开始HSSFCell cell = row.createCell(column);// 内容cell.setCellValue(message);// 格式cell.setCellStyle(cellStyle);CellRangeAddress cellAddresses = new CellRangeAddress(firstRow,lastRow,firstCol,lastCol);// 单元格合并if (merge){sheet.addMergedRegion(cellAddresses);}// 加边框if (col){setBorderStyle(sheet, cellAddresses);}return row;}/*** 通用内容格式* @param sheet HSSFSheet* @param row HSSFRow* @param cellStyle HSSFCellStyle* @param rows 第几排* @param message 内容* @param firstRow 起始行* @param lastRow 截至行* @param firstCol 起始列* @param lastCol 截至列* @param col 是否加边框* @param merge 是否合并单元格*/public static void getContentStyle(HSSFSheet sheet, HSSFRow row, HSSFCellStyle cellStyle, int rows, String message, int firstRow, int lastRow, int firstCol, int lastCol, boolean merge,boolean col){HSSFCell cell = row.createCell(rows);cell.setCellValue(message);cell.setCellStyle(cellStyle);CellRangeAddress cellAddresses = new CellRangeAddress(firstRow,lastRow,firstCol,lastCol);// 单元格合并if (merge){sheet.addMergedRegion(cellAddresses);}// 加边框if (col){setBorderStyle(sheet, cellAddresses);}}/*** 表格格式通用* @param wb 数据对象* @param level 水平位置* @param vertical 垂直位置* @param thick 字体加粗* @param size 字体大小* @param frame 是否设置边框* @return*/public static HSSFCellStyle getFormat(HSSFWorkbook wb,HorizontalAlignment level, VerticalAlignment vertical, Boolean thick, short size){// 文本格式设置HSSFCellStyle cellStyle = wb.createCellStyle();HSSFFont font = wb.createFont();//水平居左cellStyle.setAlignment(level);//垂直居中cellStyle.setVerticalAlignment(vertical);// 字体加粗font.setBold(thick);// 字体大小font.setFontHeightInPoints(size);cellStyle.setFont(font);return cellStyle;}/*** 设置合并单元格边框 - 线条**/private static void setBorderStyle(Sheet sheet, CellRangeAddress region) {// 合并单元格左边框样式RegionUtil.setBorderLeft(BorderStyle.MEDIUM, region, sheet);RegionUtil.setLeftBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格上边框样式RegionUtil.setBorderTop(BorderStyle.MEDIUM, region, sheet);RegionUtil.setTopBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格右边框样式RegionUtil.setBorderRight(BorderStyle.MEDIUM, region, sheet);RegionUtil.setRightBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格下边框样式RegionUtil.setBorderBottom(BorderStyle.MEDIUM, region, sheet);RegionUtil.setBottomBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);}

重点就是在几个通用的方法里面,我们一个一个来讲
1,样式

/*** 表格格式通用* @param wb 数据对象* @param level 水平位置* @param vertical 垂直位置* @param thick 字体加粗* @param size 字体大小* @param frame 是否设置边框* @return*/public static HSSFCellStyle getFormat(HSSFWorkbook wb,HorizontalAlignment level, VerticalAlignment vertical, Boolean thick, short size){// 文本格式设置HSSFCellStyle cellStyle = wb.createCellStyle();HSSFFont font = wb.createFont();//水平居中cellStyle.setAlignment(level);//垂直居中cellStyle.setVerticalAlignment(vertical);// 字体加粗font.setBold(thick);// 主体样式font.setFontName("宋体");// 字体大小font.setFontHeightInPoints(size);cellStyle.setFont(font);return cellStyle;}

POI样式对象 HSSFCellStyle 有兴趣的朋友可以私下了解这个对象 官网说明
1,通过HSSFWorkbook 的 createCellStyle()实例化 HSSFCellStyle 对象
2,HSSFFont 实例化设置字体样式 官网说明
3,水平居中 cellStyle.setAlignment(level); 官网说明
4,垂直居中 cellStyle.setVerticalAlignment(vertical); 官网说明
5,字体加粗 font.setBold(thick);
6,字体大小 font.setFontHeightInPoints(size);
7,字体样式 font.setFontName(“宋体”);
8, 然后把font对象给到HSSFCellStyle*

cellStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle2.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());

这两个是用来设置单元格颜色

2,单元格边框

/*** 设置合并单元格边框 - 线条**/private static void setBorderStyle(Sheet sheet, CellRangeAddress region) {// 合并单元格左边框样式RegionUtil.setBorderLeft(BorderStyle.MEDIUM, region, sheet);RegionUtil.setLeftBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格上边框样式RegionUtil.setBorderTop(BorderStyle.MEDIUM, region, sheet);RegionUtil.setTopBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格右边框样式RegionUtil.setBorderRight(BorderStyle.MEDIUM, region, sheet);RegionUtil.setRightBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);// 合并单元格下边框样式RegionUtil.setBorderBottom(BorderStyle.MEDIUM, region, sheet);RegionUtil.setBottomBorderColor(IndexedColors.BLACK.getIndex(), region, sheet);}

可以设置边框的样式和颜色
这里要用到CellRangeAddress 属性他主要用来合并单元格

 CellRangeAddress cellAddresses = new CellRangeAddress(firstRow,lastRow,firstCol,lastCol);
 * firstRow 起始行* lastRow 截至行* firstCol 起始列* lastCol 截至列

RegionUtil是处理表格边框POI自带的工具类 官网说明
设置边框样式和粗细 RegionUtil.setBorderTop(BorderStyle.THIN, region, sheet); 官网说明
设置边框颜色 RegionUtil.setRightBorderColor(IndexedColors.BLACK.getIndex(), region, sheet); 官网说明

3,通用标题内容

/*** 通用标题样式* @param sheet HSSFSheet* @param cellStyle HSSFCellStyle* @param rows 第几排* @param size 格子大小* @param column 第几行* @param message 内容* @param firstRow 起始行* @param lastRow 截至行* @param firstCol 起始列* @param lastCol 截至列* @param col 是否加边框* @param merge 是否合并单元格* @return*/public static HSSFRow getTitleStyle(HSSFSheet sheet, HSSFCellStyle cellStyle, int rows, int size, int column, String message, int firstRow, int lastRow, int firstCol, int lastCol,boolean merge, boolean col){// 得到行HSSFRow row=sheet.createRow(rows);// 格式大小if (size != 0){row.setHeight((short)(size));}// 从第几行开始HSSFCell cell = row.createCell(column);// 内容cell.setCellValue(message);// 格式cell.setCellStyle(cellStyle);CellRangeAddress cellAddresses = new CellRangeAddress(firstRow,lastRow,firstCol,lastCol);// 单元格合并if (merge){sheet.addMergedRegion(cellAddresses);}// 加边框if (col){setBorderStyle(sheet, cellAddresses);}return row;}

这个方法是我自己抽象出来的方法
给个小栗子吧

HSSFSheet sheet=wb.createSheet("检查记录模板导出");
HSSFCellStyle cellStyle = getFormat(wb, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, true, (short) 11);
HSSFRow row = getTitleStyle(sheet, cellStyle, 7, 12 * 30, 0, "✓   现场检查", 7, 7, 0, 3, true,true);

第一行不用讲了 建立新的sheet对象(excel的表单)
第二行上面讲到的样式通用方法,他的意思是 HorizontalAlignment.CENTER(水平居中) VerticalAlignment.CENTER(垂直居中)true 字体加粗,11 字体大小 然后得到HSSFCellStyle
第三行 把刚才设置的样式给到他,
7、从第7列开始
12 * 30、表示单元格的大小
0、从第0行开始
✓ 现场检查、单元格内容
7, 7, 0, 3、表示从第七列开始第七列结束 从第0行开始第3行结束进行合并单元格和设置边框
true、是否合并单元格
true、是否设置边框

4,然后是通用内容格式

/*** 通用内容格式* @param sheet HSSFSheet* @param row HSSFRow* @param cellStyle HSSFCellStyle* @param rows 第几排* @param message 内容* @param firstRow 起始行* @param lastRow 截至行* @param firstCol 起始列* @param lastCol 截至列* @param col 是否加边框* @param merge 是否合并单元格*/public static void getContentStyle(HSSFSheet sheet, HSSFRow row, HSSFCellStyle cellStyle, int rows, String message, int firstRow, int lastRow, int firstCol, int lastCol, boolean merge,boolean col){HSSFCell cell = row.createCell(rows);cell.setCellValue(message);cell.setCellStyle(cellStyle);CellRangeAddress cellAddresses = new CellRangeAddress(firstRow,lastRow,firstCol,lastCol);// 单元格合并if (merge){sheet.addMergedRegion(cellAddresses);}// 加边框if (col){setBorderStyle(sheet, cellAddresses);}}

小栗子:

HSSFSheet sheet=wb.createSheet("检查记录模板导出");
HSSFCellStyle cellStyle = getFormat(wb, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, true, (short) 11);
HSSFRow row = getTitleStyle(sheet, cellStyle, 7, 12 * 30, 0, "✓   现场检查", 7, 7, 0, 3, true,true);getContentStyle(sheet, row, cellStyle, 4, "□   书面检查", 7,7,4,7, true,true);
getContentStyle(sheet, row, cellStyle, 8, "□   其他方式:", 7,7,8,10, true,true);

上面的三行讲过了,主要是下面两行就比较简单了
sheet,和标题得到的row(行),cellStyle给到他
4、从第几行开始(这里从第4行开始可以参考上面的截图)
□ 书面检查、内容
7,7,4,7、表示从第七列开始第七列结束 从第4行开始第3行结束进行合并单元格和设置边框
true、是否合并单元格
true、是否设置边框


后续:要求吧导出来的excel改为pdf让用户不可修改!
我这里使用的是e-iceblue的spire.xls.free
pom依赖(阿里仓库没有这个依赖,要指定仓库)

    <repositories><repository><id>com.e-iceblue</id><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository></repositories><dependency><groupId>e-iceblue</groupId><artifactId>spire.xls.free</artifactId><version>3.9.1</version></dependency>

导出代码

     FileOutputStream outputStream = new FileOutputStream("check.xls");wb.write(outputStream);outputStream.close();// 先得到表格路径File file = new File("check.xls");ConvertExcelToPdf.getExcelToPdf(file.getAbsolutePath(),response);/*** 表格转pdf* @param path*/public static void getExcelToPdf(String path, HttpServletResponse response) throws IOException {//创建一个Workbook实例并加载Excel文件Workbook workbook = new Workbook();workbook.loadFromFile(path);//设置转换后的PDF页面高宽适应工作表的内容大小workbook.getConverterSetting().setSheetFitToPage(true);//将生成的文档保存到指定路径(这里把报告下载到根路径)workbook.saveToFile("output/检查报告.pdf", FileFormat.PDF);response.setContentType("multipart/form-data");// 设置Content-Dispositionresponse.setHeader("Content-Disposition", "attachment;filename=检查报告.pdf");// 输出流OutputStream out = response.getOutputStream();// 获取服务端生成的pdf文件,拿到在本地的文件进行下载File file = new File("output/检查报告.pdf");System.out.println(file.getAbsolutePath());InputStream in = new FileInputStream(file);// 输出文件int console;while((console=in.read())!=-1){out.write(console);}in.close();out.close();}

我这里先吧xls导出到根路径,然后用File拿到文件路径调用getExcelToPdf方法转pdf下载

java使用poi实现导出表格模板相关推荐

  1. Java使用Poi填充Word表格模板(图片和文字)

    Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...

  2. Java使用poi加载Excel模板,将查询出来的数据封装到Excel中并进行指定某些列的合并操作

    Java使用poi加载Excel模板,将查询出来的数据封装到Excel中并进行指定某些列的合并操作 最近一周项目中需要读取数据库中的记录将记录封装到给定的模板中,指定业务列需要进行合并:下面将它进行整 ...

  3. 【工具类】JAVA POI 代码导出表格的两种办法(代码全注释,小白也不怕)

    讲点废话,吐个槽 最近有个要求,表格导出,之前也搞过,但觉得每次都到处找太麻烦了,有些大佬,展示部分代码,看着挺多个类,复制粘贴运行就报错,一检查,少个关键类,没办法跑,要么就是标注个什么什么大全,下 ...

  4. Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解,生成目录,生成折线图、柱状图、饼状图

    导出段落 public void exportSummarizeWord(HttpServletResponse response, Integer id) {Summarize summarize ...

  5. java 通用工具 POI XSSF导出.xls或者.xlsx

    我是用的java类反射方式生成的excel 1. pom依赖 <!-- <artifactId>poi</artifactId> //适用于低版本,也就是xls结尾的Ex ...

  6. java通过poi生成excel表格(自适应列宽、合并单元格后的边框添加)

    具体java通过POI读写Excel的基本使用方法可参考: POI读写Excel的基本使用 1.项目导入依赖: <!--xls--> <dependency><group ...

  7. java 使用POI简单excel表格导出,通过浏览器直接下载

    pom.xl依赖 <!--POI Excel表格导出依赖--> <dependency><groupId>org.apache.poi</groupId> ...

  8. 【Java】poi-tl实现导出Word模板并动态渲染数据

    文章目录 前言 优点 缺点 使用 引入依赖 渲染普通占位符 表格渲染 前言 最近做项目的时候会遇到要求要导出以docx格式结尾的报告文件,于是我就在思考有没有一个比较好用的第三方类库能解决在word上 ...

  9. Java使用POI实现导出Word文档

    POI官网链接:http://deepoove.com/poi-tl/(方便各位博友后期深入学习) 1.首先导入POM依赖包 <dependency><groupId>com. ...

最新文章

  1. python需要学数据结构吗_Python新手学习基础之数据结构-对数据结构的认知
  2. 如何对mysql做物理备份_如何创建物理MySQL备份
  3. html怎么控制进度条,HTML如何实现进度条?附源码
  4. 4-Spring Boot 的视图
  5. Java 初始化 代码块_Java中初始化块详解及实例代码
  6. mysql replace 不区分大小写_mysql 不区分大小写的解决
  7. python 在线培训费用-在线Python编程培训哪家机构比较好?
  8. Android初学第9天
  9. 分享一下Java从基础到进阶各阶段视频教程
  10. 用Adobe Illustrator将位图转为矢量图并上色
  11. linux spdbv教程,计算机化学实践基础教程
  12. C语言sin定积分,C语言实现黎曼和求定积分
  13. foxmail收件不及时_foxmail突然收不到邮件怎么办_foxmail突然无法接收邮件的解决方法...
  14. Windows进行磁盘碎片化整理
  15. c++图像处理之对比度拉伸变换
  16. python基础螺旋线
  17. 数据结构与算法分析:实现list【理解 iter++ 和 ++iter 】
  18. 在word表格中如何快速清除表格内容?
  19. python web项目打包部署_打包package
  20. 排队打水问题(water)

热门文章

  1. Linux aarch64交叉编译之 mesa图形库
  2. log softmax的梯度求解 (Gradient of log(softmax) )
  3. uipath操作excel写入数据
  4. 计算机窗口允许用户根据需要决定,国网计算机2012年职称考试理论习题(选择题_按字母排序)...
  5. 最有价值的学术报告大都不是来自院士!(转载)
  6. 【Arduino+ESP32专题】PlatformIO编程ESP32 Guru Meditation Error错误溯源
  7. vue使用elementui合并单元格,并合并单元格中的值
  8. Let's implement a Gaussian Naive Bayes classifier in Python
  9. android 系统功能,安卓8.0系统对比安卓8.1系统 安卓8.1系统那些你所不知道的新功能...
  10. 自己做量化交易软件(35)小白量化实战8--事件型回测程序