原图

合并之后图片

工具类ExportExcel
package com.daxiao.test.util;

/**

  • Created by Bob on 2021/5/12.
    */
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.DecimalFormat;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Pattern;

import com.daxiao.test.poJo.MergeModel;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExportExcel {
/**
* 创建excel文件
* @param objData 数据
* @param fileName 文件名
* @param sheetName sheet名
* @param columns 表头
* @param mergeIndex 需要合并的列号集合
* @return
*/
public static int exportToExcelForXlsx(List<List> objData,String fileName, String sheetName, List columns,List mergeIndex) {
int flag = 0;

    // 创建工作薄XSSFWorkbook wb = new XSSFWorkbook();// sheet1XSSFSheet sheet1 = wb.createSheet(sheetName);//设置样式XSSFCellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);//水平对齐//表头sheet1.createFreezePane(0, 1);//冻结表头XSSFRow sheet1row1 = sheet1.createRow((short) 0);sheet1row1.setHeight((short) 480);//写入表头if (columns != null && columns.size() > 0) {for(int i=0;i<columns.size();i++) {String column = columns.get(i);//列XSSFCell cell = sheet1row1.createCell(i);cell.setCellValue(column);}}int dataSatrtIndex = 1;//数据开始行boolean isMerge = false;if(mergeIndex != null && mergeIndex.size() != 0) {isMerge = true;}//写入数据if (objData != null && objData.size() > 0) {Map<Integer,MergeModel> poiModels = new HashMap<Integer, MergeModel>();//循环写入表中数据int i = 0;for ( ; i < objData.size(); i++) {//数据行XSSFRow row = sheet1.createRow((short) (i+dataSatrtIndex));//行内循环,既单元格(列)List<Object> list = objData.get(i);DecimalFormat decimalFormat = new DecimalFormat("0.00");int j = 0;for (Object o : list) {//数据列String content = "";if(o != null) {if (o.toString().contains(".") && isNumeric(o.toString())) {content = decimalFormat.format(Float.valueOf(o.toString()));} else if (o.toString().contains("-") && o.toString().contains(":")) {content = String.valueOf(o).split("\\.")[0];}else {content = String.valueOf(o);}}if(isMerge && mergeIndex.contains(j)) {//如果该列需要合并MergeModel poiModel = poiModels.get(j);if(poiModel == null) {poiModel = new MergeModel();poiModel.setContent(content);poiModel.setRowIndex(i + dataSatrtIndex);poiModel.setCellIndex(j);poiModels.put(j, poiModel);}else {if(!poiModel.getContent().equals(content)) {//如果不同了,则将前面的数据合并写入XSSFRow lastRow = sheet1.getRow(poiModel.getRowIndex());XSSFCell lastCell = lastRow.createCell(poiModel.getCellIndex());//创建列lastCell.setCellValue(poiModel.getContent());//合并单元格if(poiModel.getRowIndex() != i + dataSatrtIndex - 1) {sheet1.addMergedRegion(new CellRangeAddress(poiModel.getRowIndex(), i + dataSatrtIndex - 1, poiModel.getCellIndex(), poiModel.getCellIndex()));}//将新数据存入poiModel.setContent(content);poiModel.setRowIndex(i + dataSatrtIndex);poiModel.setCellIndex(j);poiModels.put(j, poiModel);}}row.createCell(j);//创建单元格}else {//该列不需要合并//数据列XSSFCell cell = row.createCell(j);cell.setCellValue(content);}j++;}}//将最后一份存入if(poiModels != null && poiModels.size() != 0) {for(Integer key : poiModels.keySet()) {MergeModel poiModel = poiModels.get(key);XSSFRow lastRow = sheet1.getRow(poiModel.getRowIndex());XSSFCell lastCell = lastRow.getCell(poiModel.getCellIndex());lastCell.setCellValue(poiModel.getContent());//合并单元格if(poiModel.getRowIndex() != i + dataSatrtIndex -1) {sheet1.addMergedRegion(new CellRangeAddress(poiModel.getRowIndex(), i + dataSatrtIndex - 1, poiModel.getCellIndex(), poiModel.getCellIndex()));}}}} else {flag = -1;}//设置固定列宽,poi的列宽设置有点操蛋,大概规律网上有不少版本自行百度//这里大概是143像素for (int i = 0; i < columns.size(); i++) {sheet1.setColumnWidth(i, 4550);}FileOutputStream out = null;try {out = new FileOutputStream("E:\\" + fileName + ".xlsx");wb.write(out);} catch (Exception ex) {try {out.flush();out.close();}catch (IOException e){e.printStackTrace();}}return flag;
}/***     判断是不是数字* @param str* @return*/
private static boolean isNumeric(String str){if(str == null || str.length() == 0) {return false;}Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");return pattern.matcher(str).matches();
}

}

pojo
package com.daxiao.test.poJo;

/**

  • Created by Bob on 2021/5/12.
    */

public class PoiModel {
private String content;

private String oldContent;private int rowIndex;private int cellIndex;public String getOldContent() {return oldContent;
}public void setOldContent(String oldContent) {this.oldContent = oldContent;
}public String getContent() {return content;
}public void setContent(String content) {this.content = content;
}public int getRowIndex() {return rowIndex;
}public void setRowIndex(int rowIndex) {this.rowIndex = rowIndex;
}public int getCellIndex() {return cellIndex;
}public void setCellIndex(int cellIndex) {this.cellIndex = cellIndex;
}

}

public class Startover {
public static void main(String[] args) {
List columns = new ArrayList<>();//标头
columns.add(“目录”);
columns.add(“目录”);
columns.add(“目录”);
columns.add(“内容”);
String fileName = “文件名字”;//文件名字
String sheetName = “sheet名字”;//sheet名字
//内容数据
List<List> exportData = new ArrayList<>();
//行内的数据
List rowData = new ArrayList();
rowData.add(“一级目录1”);
rowData.add(“二级目录1”);
rowData.add(“三级目录1”);
rowData.add(“内容1”);
exportData.add(rowData);
List rowData2 = new ArrayList();
rowData2.add(“一级目录1”);
rowData2.add(“二级目录1”);
rowData2.add(“三级目录1”);
rowData2.add(“内容2”);
exportData.add(rowData2);
List rowData3 = new ArrayList();
rowData3.add(“一级目录1”);
rowData3.add(“二级目录1”);
rowData3.add(“三级目录2”);
rowData3.add(“内容3”);
exportData.add(rowData3);
List rowData4 = new ArrayList();
rowData4.add(“一级目录1”);
rowData4.add(“二级目录1”);
rowData4.add(“三级目录2”);
rowData4.add(“内容4”);
exportData.add(rowData4);
List rowData5 = new ArrayList();
rowData5.add(“一级目录1”);
rowData5.add(“二级目录2”);
rowData5.add(“三级目录3”);
rowData5.add(“内容5”);
exportData.add(rowData5);
List rowData6 = new ArrayList();
rowData6.add(“一级目录1”);
rowData6.add(“二级目录2”);
rowData6.add(“三级目录3”);
rowData6.add(“内容6”);
exportData.add(rowData6);
//需要合并的列号
List mergeIndex = new ArrayList();
mergeIndex.add(0);
mergeIndex.add(1);
mergeIndex.add(2);
int flag = ExportExcel.exportToExcelForXlsx(exportData, fileName, sheetName, columns, mergeIndex);
System.out.println(flag);
}
}

因为我的数据是在内网,拿出来比较麻烦,实现的效果和图片内容一样

转自:http://www.bubuko.com/infodetail-3613922.html?cf_chl_jschl_tk=3e4633a1a7393b9add9b809609dc1b065902757a-1620785914-0-AetcD7IGJN3edlQCOR_qMh22GK4KhXnfMUkxGx4PvHgc331sqg7iiwI03_oHwrXVwL3YSjhyq0TYiPN0ojJ8RI6fgO9oFR350ZjMuxrcebr59hS_T8nCGwhLGvRf2Mp7alobIIclge8Yyj6POQO_XE2yW6G6t6c7nOTmhSDkchrbn0Ok6BjmtSh4DPndJBpshjmF6xGiPtw6iOC_IUgTM2YQtEvMyVwckrUkjSdVWa4x9WlqzjFSxHAbSHBbuxuSDEIErtZABHy0uOL6FUeaWe5BFgDRI-0m9b7yzp0TJXi8yMuXj235qltBHra_CawI66qSTmP22wb8Var92FiOuonfonrAogun1dNakrbcHxm5akGSzAVnXJP7295lz5NtHjr3PzGTOGS_q8VRuERAXJ8

poi导出excel 并实现合并单元格相关推荐

  1. 使用poi导出excel,及合并单元格边框显示问题

    使用poi导出excel,及合并单元格边框显示问题. 首先创建workbook.sheet HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet s ...

  2. POI导出Excel,并合并单元格

    最近根据公司需求,写一个导出Excel的功能,我使用的是POI,没有选择easyPOI,这里根据POI的基本功能,自己写了一个工具类,可以大大减少工作量,分享到这里,希望能帮到有需要的小伙伴. 先上结 ...

  3. Java POI导出Excel时,合并单元格没有边框的问题

    今天用POI导出Excel的时候,发现导出的单元格确少边框,最后发现有2个方案可以解决. 方案一 CellRangeAddress的4个参数分别表示:起始行号,终止行号, 起始列号,终止列号 // 使 ...

  4. java poi导出Excel表,合并单元格

    其他参考文章: http://www.cnblogs.com/bmbm/archive/2011/12/08/2342261.html http://www.cnblogs.com/xuyuanjia ...

  5. java导出excel 复杂的 合并单元格

    导出excel 复杂的 合并单元格 private void exportExcel(List<IuDocStatisticsExcelVo> iuDocStatisticsVos, St ...

  6. java使用poi生成Excel文件并合并单元格

    java使用poi生成Excel文件并合并单元格        业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...

  7. excel导出java不完整_有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。...

    我在table变换excel之后发现合并的单元格不能显示全部边框,在网上找了半天解决方案,终于解决了.具体解决代码如下; /** * 设置合并单元格的边框样式 * * @param sheet 当前表 ...

  8. java输出excel 异常处理_使用poi导出Excel,并设定单元格内容类型,抛出异常

    本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...

  9. 纯前端js(或者vue)导出excel实现:合并单元格、设置单元格样式、单元格内换行

    前提是安装xlsx,已经可以导出普通的excel npm install --save xlsx file-saver 然后需要安装 npm install xlsx-style 如果运行的时候报错 ...

  10. POI导出Excel文件时,单元格内文字竖排、横排默认不展示,必须点击一下问题解决

    //创建单元格样式设置CellStyle cs_vertical = wb.createCellStyle();//设置字体Font textFont = wb.createFont();textFo ...

最新文章

  1. 最近,又一家互联网公司裁员了,失业来得太突然…
  2. vue 单选框样式_作为一位Vue工程师,这些开发技巧你都会吗?
  3. 手把手带你领略双十一背后的核心技术Sentinel之热点参数限流
  4. C++设计模式之工厂模式(1)
  5. 2019.7.16考试总结
  6. Flex 学习笔记------FLACC Crossbridge
  7. linux 脚本批量删除,Linux Shell使用Bash脚本批量删除文件
  8. 怎样呵护友谊_呵护真正的友情,助力漫长的人生
  9. WinForm------TreeList修改节点图标和按钮样式
  10. list 转 json,以及 json 解析
  11. 可变模糊集理论matlab程序,可变模糊集理论.pdf
  12. 传说中的世界500强面试题-推理能力(1)
  13. 使用Mybatis报错“Type interface com.test.mapper.UserMapper is not known to the MapperRegistry.“
  14. Scala+HuffmanCoding实现无损压缩
  15. python中iter是什么意思_iter的用途是什么?
  16. java周总结1113_流总结_序列化_xml_html
  17. DB2-SQLSTATE 消息大全---[IBM官方]
  18. 【金三银四】2022 Android面经实录
  19. 使用Heritrix进行主题抓取
  20. Spring排除功能

热门文章

  1. 四川大学mac用户登陆锐捷校园网指南
  2. SoapUI调试soap协议接口
  3. marvell raid linux,华硕P7F-M (-MARVELL 88SE6145 SATA RAID)主板驱动-版下载,适用于win7,Win7-64,winxp-驱动精灵...
  4. Androd TV开发-前言
  5. 手机号码归属地查询App
  6. MySql常用函数大全(详细)
  7. 竞价推广的流程有哪些?
  8. Python-Numpy语法总结-数组的创建
  9. 测试鼠标传感器的软件,光电鼠标传感器的精密测量与控制系统 - 嵌入式设计应用 - 电子发烧友网...
  10. 协作多智能体强化学习中的回报函数设计