Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ReportFormsManagerImpl.java =================================================================== diff -u -r31224 -r31286 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ReportFormsManagerImpl.java (.../ReportFormsManagerImpl.java) (revision 31224) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ReportFormsManagerImpl.java (.../ReportFormsManagerImpl.java) (revision 31286) @@ -12,6 +12,7 @@ import java.io.OutputStream; import java.math.BigDecimal; import java.net.URLDecoder; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -500,7 +501,7 @@ // 指定结束的单元格行索引,相当于宽,默认18 int col2 = 18; // 指定结束的单元格列索引,相当于高,row2=row1+col2*(height/width)*3.5,乘以3.5是因为单元格的宽是高的3.5倍 - int row2 = 0; + int row2 = 3;//预留两个位置放标题 if(fileContent.length() > 0){ width = Double.valueOf(fileSize.split(":")[0]); height = Double.valueOf(fileSize.split(":")[1]); @@ -520,7 +521,15 @@ BASE64Decoder decoder = new BASE64Decoder(); htmlTable = new String(decoder.decodeBuffer(htmlTable)); htmlTable = java.net.URLDecoder.decode(htmlTable,"UTF-8"); - ConvertHtml2Excel.table2Excel(row2 + 2, wb, sheet, htmlTable); + List crossRowEleMetaLs = new ArrayList(); + //先生成表体,再获取标体列数,设置标题 + ConvertHtml2Excel.table2Excel(row2 + 2, wb, sheet, htmlTable, crossRowEleMetaLs); + //获取列数 生成标题 + int coloumNum=sheet.getRow(row2 + 3).getPhysicalNumberOfCells(); + String titlHtmls = "

"+ fileName.substring(0, fileName.indexOf(".xls")) +"

"; + ConvertHtml2Excel.createTitle(0, wb, sheet, titlHtmls, crossRowEleMetaLs); + //合并表头 + ConvertHtml2Excel.mergedTbaleHeader(sheet, crossRowEleMetaLs); out = response.getOutputStream(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1" )); Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ConvertHtml2Excel.java =================================================================== diff -u -r31210 -r31286 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ConvertHtml2Excel.java (.../ConvertHtml2Excel.java) (revision 31210) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/reportforms/service/ConvertHtml2Excel.java (.../ConvertHtml2Excel.java) (revision 31286) @@ -23,13 +23,13 @@ public class ConvertHtml2Excel { /** - * html表格转excel + * html表格转excel 调用之后需调用mergedTbaleHeader方法 * @param rowIndex row开始下标 * @param HSSFWorkbook 一个webbook,对应一个Excel文件 用于在已有的文件中添加表格 * @param tableHtml ....
* @return */ - public static HSSFWorkbook table2Excel(int rowIndex, HSSFWorkbook wb, HSSFSheet sheet,String tableHtml) { + public static HSSFWorkbook table2Excel(int rowIndex, HSSFWorkbook wb, HSSFSheet sheet,String tableHtml, List crossRowEleMetaLs) { if(wb == null){ wb = new HSSFWorkbook(); } @@ -38,12 +38,11 @@ } HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); - List crossRowEleMetaLs = new ArrayList<>(); try { Document data = DocumentHelper.parseText(tableHtml); // 生成表头 Element thead = data.getRootElement().element("thead"); - HSSFCellStyle titleStyle = getTitleStyle(wb); + HSSFCellStyle titleStyle = getHeaderStyle(wb); if (thead != null) { List trLs = thead.elements("tr"); for (Element trEle : trLs) { @@ -84,10 +83,6 @@ rowIndex++; } } - // 合并表头 - for (CrossRangeCellMeta crcm : crossRowEleMetaLs) { - sheet.addMergedRegion(new CellRangeAddress(crcm.getFirstRow(), crcm.getLastRow(), crcm.getFirstCol(), crcm.getLastCol())); - } } catch (DocumentException e) { e.printStackTrace(); } @@ -97,8 +92,32 @@ } return wb; } - /** + * 生成标题 + * @param startRowNum 标题开始行数 + * @param wb HSSFWorkbook + * @param sheet HSSFSheet + * @param titlHtmls 标题 支持多个 + * @param crossRowEleMetaLs 跨行跨列 + */ + public static void createTitle(int startRowNum, HSSFWorkbook wb, HSSFSheet sheet, String titlHtmls, List crossRowEleMetaLs){ + Document data = null; + try { + data = DocumentHelper.parseText(titlHtmls); + List trLs = data.getRootElement().elements("p"); + HSSFCellStyle titleStyle = ConvertHtml2Excel.getTitleStyle(wb); + if (trLs != null && trLs.size() > 0) { + HSSFRow row = sheet.createRow(startRowNum); + ConvertHtml2Excel.makeRowCell(trLs, startRowNum, row, 0, titleStyle, crossRowEleMetaLs); + row.setHeightInPoints(16); + startRowNum++; + } + } catch (DocumentException e) { + e.printStackTrace(); + } + + } + /** * 生产行内容 * @param tdLs th或者td集合 * @param rowIndex 行号 @@ -108,7 +127,7 @@ * @param crossRowEleMetaLs 跨行元数据集合 * @return 最后一列的cell index */ - private static int makeRowCell(List tdLs, int rowIndex, HSSFRow row, int startCellIndex, HSSFCellStyle cellStyle, + protected static int makeRowCell(List tdLs, int rowIndex, HSSFRow row, int startCellIndex, HSSFCellStyle cellStyle, List crossRowEleMetaLs) { int i = startCellIndex; for (int eleIndex = 0; eleIndex < tdLs.size(); i++, eleIndex++) { @@ -174,11 +193,11 @@ } /** - * 获得标题样式 + * 获得表头样式 * @param workbook * @return */ - private static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) { + private static HSSFCellStyle getHeaderStyle(HSSFWorkbook workbook) { short fontSize = 12; String fontName = "宋体"; HSSFCellStyle style = workbook.createCellStyle(); @@ -231,7 +250,7 @@ * @param wb * @return */ - private static HSSFCellStyle getContentStyle(HSSFWorkbook wb) { + protected static HSSFCellStyle getContentStyle(HSSFWorkbook wb) { short fontSize = 12; String fontName = "宋体"; HSSFCellStyle style = wb.createCellStyle(); @@ -246,4 +265,31 @@ style.setFont(font); return style; } + /** + * 获得标题样式 + * @param wb + * @return + */ + protected static HSSFCellStyle getTitleStyle(HSSFWorkbook wb) { + short fontSize = 14; + String fontName = "宋体"; + HSSFCellStyle style = wb.createCellStyle(); + style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); + style.setAlignment(HSSFCellStyle.ALIGN_CENTER); + HSSFFont font = wb.createFont(); + font.setFontName(fontName); + font.setFontHeightInPoints(fontSize); + font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + style.setFont(font); + return style; + } + /** + * 合并表头 + * @param crossRowEleMetaLs + */ + protected static void mergedTbaleHeader(HSSFSheet sheet, List crossRowEleMetaLs){ + for (CrossRangeCellMeta crcm : crossRowEleMetaLs) { + sheet.addMergedRegion(new CellRangeAddress(crcm.getFirstRow(), crcm.getLastRow(), crcm.getFirstCol(), crcm.getLastCol())); + } + } }