栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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": "1888888@163.com",
    "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);
                    }

                }

 最后一步:导出

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();
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/282081.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号