1、引入maven依赖

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency>

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<String,Integer> 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<JSONObject> sourceMapList =  JSONArray.parseArray(dataJson); // dataJson为上面的JSON数组数据for (JSONObject jsonObject: sourceMapList) {// 获取当前作者有多少本书,如果大于1本,则需要合并单元格List<JSONObject > bookInfoList= JSONArray.parseArray(String.valueOf(jsonObject.get("book_info")));if(bookInfoList.size() > 1){// 这里的rowNum 在上面创建完标题行后变为1,因为本例中需要将表格前五列的行按照书本的数量进行(行的合并)// 假如一个作者有三本书,在遍历完这个作者所有书的时候,rowNum将变成当前的rowNum + 3sheet.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();}

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

  1. java POI导出excel,合并单元格边框消失

    业务是导出一个报表,要求有一个跨多列的表头,肯定要用到合并单元格,但合并后边框消失.网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要. 原来是这样的: 合并后就第一个有边框,其余全成 ...

  2. POI导出EXCEL合并单元格对象嵌套List数据

    导出EXCEL 在实际的开发过程当中,我们会遇到一些比较复杂的导出需求,例如需要导出的实体类中需要嵌套集合对象等,正好最近碰到了所以分享出来,希望对大家有帮助 一.POI是什么 简单的说就是Apach ...

  3. poi导出Excel合并单元格、设置打印参数页眉页脚等

    由于生成文件不能落地,使用SXSSFWorkBook来对excel的导出工作 生成excel步骤: 1.创建workbook SXSSFWorkbook workbook=new SXSSFWorkb ...

  4. poi导出excel合并单元格

    /*导出服务*/@RequestMapping(value = "/exportMaintenance.html")public void exportMaintenance(Ht ...

  5. Java POI 对Excel合并单元格的数据处理

    Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求. Excel工具类 ...

  6. springboot项目导出excel 合并单元格表格

    springboot项目导出excel 合并单元格表格 导出效果 业务controller 业务数据 业务实体类 注解MyExcel.java 注解 MyExcels 导出工具类MyExcelUtil ...

  7. POI导出Excel设置单元格背景色

    POI导出Excel设置单元格背景色 导出Excel的时候,没有设置背景色,用2003版本的Excel工具打开会出现文档单元格背景自动填充黑色的情况,没有找到好的解决方法,就主动给他填充一种颜色,问题 ...

  8. POI导出——Excel实现单元格的背景色填充

    1.背景 随着业务需求的扩充,简简单单的Excel导出已经不能满足客户的胃口了.而POI api这个家伙里面的坑有时候真的是让你分分钟没有脾气,所以打算记录下来,分享一下poi的坑及其解决方法. 2. ...

  9. java导出excel合并单元格

    今天是2018最后一天了,废话就不多说了直接上干货吧! 1.java导出excel用到POI所有jar包 ,大家可以直接到下面地址下载点击打开链接 2.导出excel的方法 package org; ...

  10. java导出excel 边框不全_POI 导出Excel合并单元格后部分边框不显示

    用户需要导出自定义表格,其中合并单元格样式遇到的问题,合并后只显示第一行第一列的边框,其他边框不显示,于是遍查百度,寻到一点思路 ①了解Excel绘制原理 ②了解绘制Excel顺序 ③绘制Excel单 ...

最新文章

  1. 解决:安装SQl 2008为SQL Server代理服务提供的凭据无效
  2. java面试问题你知道几个呢?
  3. 第一周小组博客作业——1701班5组
  4. python中return和and连用
  5. link rel=canonical 用法
  6. HugeTLB Pages大页内存
  7. java万年历表怎么输出6_用Java编程输出万年历的功能实现
  8. Android SurfaceView动画(二)
  9. python机器学习教程_从零开始掌握Python机器学习:十四步教程
  10. 高端存储下一个爆款凭什么是它?
  11. 台式计算机cpu品牌,台式电脑CPU天梯图2018年9月最新版 桌面CPU性能排名
  12. 背包问题(Knapsack Problem)—— 0/1 背包问题 —— 总价值最大问题
  13. 7-FreeSwitch-mrcp-plugin-with-freeswitch(亲测可用,自我整理)
  14. 爬去动态网站今日头条图片集
  15. 线段与线段交点的求解
  16. 360漏洞响应平台(SRC)为白帽子挑选的10本互联网安全好书
  17. 企业里用哪种文件共享服务器,企业有哪些文件共享方式、企业共享网盘推荐?...
  18. 白盒测试:语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖...
  19. 物联卡如何提高安全等级
  20. 计算机开多位数立方根原理,开立方

热门文章

  1. 大数据量查询大杀器之Mybatis 流式查询
  2. C++核心准则边译边学-I.4 接口类型应该精准且严格
  3. 95%的人都会答错的类加载的问题
  4. android app怎么给界面加背景图,想做一个Android app,但是背景不能铺满整个页面,不知道大家是用什么样的图片?...
  5. USYD悉尼大学INFO1110 Oral Exam口语考试复习资料
  6. 第三十二章 三更雪压飞狐城(三之全)
  7. 了解arXiv,及arXiv的注册详细操作。
  8. Odoo-----在Form视图中添加Chatter
  9. oracle e18,ORACLE_10g_各版本下载地址大全
  10. 我的完整版mbti职业性格测试