简单实现POI操作Excel生成数据透视图

  • 需求
  • 思考
  • 尝试
  • 实现
  • 搞完收工,去画模板了

需求

财务部门需要做一自动导出数据报表的功能,其中要有指定格式的数据透视图(柱状图、饼状图等等)

思考

正常来讲,工作三年多以来,POI导出导入数据表用的写的确实不少了(合并单元格、改背景色我还是会的),但是要用POI导出数据透视图(不是跟财务打过交道我连透视图是啥都搞不清楚)需求还是第一次遇见。遇事不决问百度,慢慢来不急。

尝试

知己知彼。想用POI导出数据透视图,先试着用excel自己做个数据透视图试试。耗时半小时,加上度娘的谆谆诱导,终于明白了一些做透视图的诀窍,行列区分啥的(又学新东西了,舒服)。
之后就是百度用POI实现了,网上大神确实写的不少
其中 这位大佬的博客实在是良心
链接: 使用POI在Excel中动态生成图表工具类(支持柱状、组合、环状图、折线图、等常用图).
直接cv代码执行,嘿,柱状图、饼状图、折线图还真老老实实出来了!
接下来就是扒代码了(半小时,我放弃了,发现平时对这一块了解少,看不太懂。。。)
继续逛gai ,之后也是这位大佬的另一篇链接: poi在Word中生成各种图表(支持柱状、组合、环状图、折线图、等常用图). 通过在word模板文档中添加占位符,读取模板替换占位符的方式实现word文档中导入图表,想着也可以用这种方案试着写excel模板替换。

实现

1、先做一个excel生成数据透视图的模板,先模拟数据生成一次

看下是否达到预期效果(调整图表名啥的)

2、替换数据对应的单元格为特殊标识,保证不要重复就行

3、代码测试

// An highlighted block
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Set;/*** @ClassName MyTest* 描述 :* @Date 2020/6/11 17:32*/
public class MyTest {public static void main(String args[]) throws Exception{String s = "{\n" +"\t\"#a1\": \"月份\",\n" +"\t\"#a2\": \"1月\",\n" +"\t\"#a3\": \"2月\",\n" +"\t\"#a4\": \"3月\",\n" +"\t\"#a5\": \"4月\",\n" +"\t\"#a6\": \"5月\",\n" +"\t\"#b1\": \"销售数据\",\n" +"\t\"#b2\": \"210\",\n" +"\t\"#b3\": \"220\",\n" +"\t\"#b4\": \"230\",\n" +"\t\"#b5\": \"240\",\n" +"\t\"#b6\": \"250\",\n" +"\t\"#c1\": \"销售金额\",\n" +"\t\"#c2\": \"2312\",\n" +"\t\"#c3\": \"2145\",\n" +"\t\"#c4\": \"5431\",\n" +"\t\"#c5\": \"2234\",\n" +"\t\"#c6\": \"1111\",\n" +"\t\"#d1\": \"投入人员\",\n" +"\t\"#d2\": \"4\",\n" +"\t\"#d3\": \"7\",\n" +"\t\"#d4\": \"9\",\n" +"\t\"#d5\": \"10\",\n" +"\t\"#d6\": \"22\",\n" +"}";JSONObject jsonObject = JSONObject.parseObject(s);Set<String> kays = jsonObject.keySet();//读取excel提前制定的excel模板
//        File file = new File("D:\\excel\\ccc.xlsx");FileInputStream is = new FileInputStream("D:\\excel\\ccc.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(is);FileOutputStream out = new FileOutputStream("D:\\excel\\ddd.xlsx");try {XSSFSheet sheet = workbook.getSheetAt(0);int lastRowNum = sheet.getLastRowNum();for(int i = 0;i<=lastRowNum;i++){XSSFRow row = sheet.getRow(i);for(int j = 0;j<4;j++){XSSFCell cell = row.getCell(j);String z = cell.getStringCellValue();if(null != z ){if(kays.contains(z)){if(z.contains("1") || z.contains("a")){String d = jsonObject.getString(z);cell.setCellValue(d);}else{Integer d = jsonObject.getInteger(z);cell.setCellValue(d);}}else{row.removeCell(cell);}}}}workbook.write(out);}catch (Exception e){e.printStackTrace();}finally {out.flush();is.close();out.close();}}
}

4、生成的效果还好,基本上跟自己想的差不多。数据内容要确认好内容格式,行列标题String格式,数据内容数值格式,不然数据透视表无法生成

搞完收工,去画模板了

简单实现POI操作Excel生成数据透视图相关推荐

  1. POI 操作 Excel -大数据量高效读写

    前言 poi的读取的三种模式 模式 说明 读写性 SXSSF 内存中保留一定行数数据,超过行数,将索引最低的数据刷入硬盘 只写 eventmodel 基于事件驱动,SAX的方式解析excel,cup和 ...

  2. poi操作excel之填充数据、删除行

    poi操作excel之填充数据.删除行 每篇一句励志:有人说,这世间有两种浪漫,一种是相濡以沫,另一种是相忘于江湖. 废话不多说,直接上代码! // 获取到你要填充数据的sheet XSSFSheet ...

  3. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  4. 简单封装POI导出excel

    简单封装POI导出excel Apache POI是一套根据Office Open XML标准(OOXML)和Microsoft OLE 2复合文档格式(OLE2)来处理各种文件格式的Java API ...

  5. java apache.poi_Java利用apache的POI操作Excel

    最近在写一些报表的活,顺便总结下...第一篇博文,希望多多指教. 项目中经常会设计到一些数据的报表问题,目前java中操作Excel的插件也有很多 ,我说下用apache的POI操作Excel的方法. ...

  6. POI 操作Excel的单元格样式超过64000的异常问题解决

    文章目录 POI 操作Excel的单元格样式超过64000的异常问题解决 问题描述 问题原因 问题分析和解决 简单的Excel文件生成Demo 最终的解决方案 POI 操作Excel的单元格样式超过6 ...

  7. execle java,Java使用POI操作Excel

    Java使用POI操作Excel 1. POI操作Excel 1.1. 依赖 org.apache.poi poi 4.1.0 org.apache.poi poi-ooxml 4.1.0 org.a ...

  8. POI操作excel基本使用

    不用多说,下面的一个类中就是一些POI操作Excel (xls) 的常见操作.但是真正要生成一些如报表等复杂格式Excel的时候,通常的做法都是事先把格式一切的东西都手动制作好("数据模板& ...

  9. 自己封装的poi操作Excel工具类

    在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.汇总Exc ...

最新文章

  1. linux定时器多次,Spring 定时器执行两次
  2. nuxt渲染html文件,Nuxt页面级缓存
  3. 第八周实践项目9 算法库——广义表
  4. 华兴数控g71外圆循环编程_华兴数控系统代码
  5. python动态生成html报表_Python应用phy模块生成html表格
  6. C语言中数组越界访问造成死循环现象
  7. 【Error】Less-loader 版本过高,TypeError: this.getOptions is not a function
  8. VCL已死,RAD已死(插播)
  9. Nginx图片防盗链、缓存和压缩的示例
  10. 强连通分量(tarjan求强连通分量)
  11. 前端使用 geetest 行为验证 web-部署教程
  12. Atitit.http代理的实现 代码java php c# python
  13. Cisco 路由器破解密码
  14. MFC下实现的简单随机点名器
  15. 10 个步骤让你的应用提升 10 倍性能
  16. U盘格式化后 容量变小如何解决
  17. 最小生成树 Kruskal
  18. 学习笔记二:接口与继承(内部类)
  19. 【Java】所有做过的面试题
  20. 资源网站模板Emlog程序zytheme模板

热门文章

  1. 高并发Redis微博点赞实战
  2. 排序算法-算法时间复杂度和空间复杂度概念 详细讲解
  3. Java课程设计之推箱子
  4. 关于使用Python3进行网络爬虫的字符问题
  5. 最新乐购社区源码全新版本V1.9
  6. 【Linux】Linux网络配置详解
  7. B站最新算法2017年有效
  8. android 手机分辨率与DPI对照表
  9. python画图颜色设置_python画图常规设置方式
  10. Windows下查看mysql版本