Java用POI导出Excel合并单元格、字体、居中样式

您所在的位置:网站首页 excel列怎么合并居中 Java用POI导出Excel合并单元格、字体、居中样式

Java用POI导出Excel合并单元格、字体、居中样式

2024-05-26 19:00| 来源: 网络整理| 查看: 265

1、引入maven依赖

org.apache.poi poi 4.1.0

2、此处我们以合并多行数据为例,效果如下:

 3、首先创建一个工作簿

HSSFWorkbook wb = new HSSFWorkbook(); HSSFFont blackFont = getExportFont(wb); HSSFCellStyle cellStyle = wb.createCellStyle(); private HSSFFont getExportFont(HSSFWorkbook wb) { HSSFFont blackFont = wb.createFont(); blackFont.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); blackFont.setFontName("微软雅黑"); // 设置字体颜色 blackFont.setFontHeightInPoints((short) 12); return blackFont; }

 添加样式:

​​​​​​

一、设置背景色:

cellStyle.setFillForegroundColor((short) 13);// 设置背景色

cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

二、设置边框:

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框

cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框

cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框

cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

三、设置居中:

cellStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中  cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

四、设置字体:

HSSFFont font = wb.createFont();

font.setFontName("黑体");

font.setFontHeightInPoints((short) 16);//设置字体大小 HSSFFont font2 = wb.createFont();

font2.setFontName("仿宋_GB2312");

font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示

font2.setFontHeightInPoints((short) 12); cellStyle.setFont(font);//选择需要用到的字体格式

五、设置列宽: sheet.setColumnWidth(0, 3766);

//第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500

六、设置自动换行: cellStyle.setWrapText(true);//设置自动换行

 4、在创建一个空的Sheet页,如果要创建多个分页,遍历添加即可

int rowNum = 0; HSSFSheet sheet = wb.createSheet("Sheet1的标题"); HSSFRow row = sheet.createRow(rowNum++); row.setHeight(new Short("1024")); // 设置第一行标题的行高 Map fieldIndexMap = new HashMap(); // 遍历绑定标题 int cellNum = 0; // titleMap里存的是标题集合{"ID":"ID","作者":"author","邮箱":"email","地址":"address","毕业院校":"education_school","出版书籍":"book","出版社":"publish","出版时间":"publish_time"} for (String key : titleMap.ketSet()) { sheet.setColumnWidth(cellNum, 6000); // 设置列宽,可以根据不同的内容自定义宽度 cell = getCellWithValue(cell, cellNum, fieldList[i], blackFont, cellStyle, row); fieldIndexMap.put(titleMap.get(key), cellNum); // 存放标题名称和列号的对应关系,为了后面内容绑定的时候使用 cellNum++; } // 将列的值绑定到列对象上 private HSSFCell getCellWithValue(HSSFCell cell, int cellNum, String value, HSSFFont font, HSSFCellStyle cellStyle, HSSFRow row) { cell = row.createCell(cellNum); HSSFRichTextString hssfRichTextString = new HSSFRichTextString(value); hssfRichTextString.applyFont(0, value.length(), font); cell.setCellValue(hssfRichTextString); cell.setCellStyle(cellStyle); return cell; }

到此处,标题行已经生成好了,接下来生成内容行。

首先:假定我们的数据是JSON数组格式的,内容如下:

[{     "ID": "1",     "author": "张三",     "email": "[email protected]",     "address": "北京中关村",     "education_school": "北京大学",     "book_info": [         {         "book": "Java入门到精通",         "publish": "人民出版社",         "publish_time": "2020/5/18"         },{         "book": "Mysql底层原理",         "publish": "人民出版社",         "publish_time": "2020/5/19"         },         ........     ] },  ........ ]

根据上面的JSON数组数据进行遍历,其中book_info里面存的是出版书籍、出版社和出版时间字段,这里就是一个人会对应多条数据情况,那么就需要将书籍属于同一个人的个人信息行进行单元格合并,也就是行合并。

这里使用CellRangeAddress对象:

CellRangeAddress cellRangeAddress= new CellRangeAddress(firstRow ,lastRow ,firstColumn ,lastColumn);

参数分别为:起始行号,终止行号, 起始列号,终止列号

List sourceMapList = JSONArray.parseArray(dataJson); // dataJson为上面的JSON数组数据 for (JSONObject jsonObject: sourceMapList) { // 获取当前作者有多少本书,如果大于1本,则需要合并单元格 List bookInfoList= JSONArray.parseArray(String.valueOf(jsonObject.get("book_info"))); if(bookInfoList.size() > 1){ // 这里的rowNum 在上面创建完标题行后变为1,因为本例中需要将表格前五列的行按照书本的数量进行(行的合并) // 假如一个作者有三本书,在遍历完这个作者所有书的时候,rowNum将变成当前的rowNum + 3 sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum + bookInfoList.size() -1, 0,0)); sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum + bookInfoList.size() -1, 1,1)); sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum + bookInfoList.size() -1, 2,2)); sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum + bookInfoList.size() -1, 3,3)); sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum + bookInfoList.size() -1, 4,4)); } row = sheet.createRow(rowNum); // 接下来根据各个列的值绑定到cell对象就行了 for (String key : personMap.keySet()) { if("book_info".equals(key)){ // 书籍信息的行没有合并,这里需要在遍历的时候,将rowNum设置根据书籍数量自增 HSSFRow sheetRow = null; for (int i = 0; i < bookInfoList.size(); i++) { sheetRow = sheet.createRow(rowNum); JSONObject jsonBook = bookInfoList.get(i); for (String feedKey: jsonBook.keySet()) { cell = getCellWithValue(cell, fieldIndexMap.get(feedKey), String.valueOf(jsonBook.get(feedKey)), blackFont, cellStyle, sheetRow); } rowNum++; } }else { cell = getCellWithValue(cell, fieldIndexMap.get(feedKey), String.valueOf(jsonBook.get(feedKey)), blackFont, cellStyle, sheetRow); } }

 最后一步:导出

/** * wb 工作簿 * filename 导出的文件名 */ export(response, request, wb, response.getOutputStream(), filename); public static void export(HttpServletResponse resp, HttpServletRequest request, HSSFWorkbook work, OutputStream bos, String filename) throws IOException { String header = request.getHeader("User-Agent"); if (header.contains("Firefox")) { BASE64Encoder base = new BASE64Encoder(); filename = "=?utf-8?B?" + base.encode(filename.getBytes(StandardCharsets.UTF_8)) + "?="; } else { filename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); } resp.setContentType("application/vnd.ms-excel"); resp.addHeader("Content-Disposition", "attachment;fileName=" + filename); work.write(bos); work.close(); bos.flush(); bos.close(); }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3