常用 POI 方法

本贴最后更新于 1951 天前,其中的信息可能已经时移世改

目前常见读写 Excel 的工具类开源 javaAPI 有两种方式,一个是 JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/一个是 Apache 的 POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/

POI 支持微软的 OLE2 格式文件 Office 2003 及以下版本;同时支持微软的 OOXML(Office Open XML)标准,也就是 Office 2007 以上版本。JXL 只能实现对 Excel 2003 以下版本的支持。

POI 使用 HSSF 对象操作 OLE2 格式 Excel,文件后缀为.xls 的;使用 XSSF、SXSSF 对象操作 OOXML 格式 Excel,文件后缀为.xlsx 的。

对于 OLE2 版本的 Excel,一个 Sheet 工作表它的行最多支持到 65536 行,列支持到 256 列;对于 OOXML 版本的 Excel,一个 Sheet 工作表它的行支持到 1048576 行,列支持到 16384 列。

核心 API:

数据限制:

Excel2003 2007、2010

列: 255 16384 行: 65535 1048576

=================== 基础 ===================

// 创建 excel(工作簿) 使用接口的方式来创建 Workbook wb = new HSSFWorkbook();

新建工作簿:HSSFWorkbook wb = new HSSFWorkbook();

打开工作簿:HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(xlsFile));

建立新的 sheet 对象:HSSFSheet sheet = wb.createSheet("我的第一个工作簿");

选择第一个工作簿:HSSFSheet sheet = wb.getSheetAt(0);

设置工作簿的名称:wb.setSheetName(0, "我的第一个工作簿");

创建行对象: HSSFRow nRow = null;nRow = sheet.createRow(1); //第 2 行

指定列 创建单元格对象:HSSFCell nCell = null;nCell = nRow.createCell((short)(2)); //第 3 列

指定列 创建单元格对象:nCell.setCellValue("我是单元格");

// 获取到样式的对象 CellStyle style = wb.createCellStyle();

// 创建字体对象 Font font = wb.createFont();// 设置字体大小 font.setFontHeightInPoints((short) 16);// 设置字体的名称 font.setFontName("楷体");// 设置字体 style.setFont(font);

设置样式 注意:样式不能重复设置 nCell.setCellStyle(leftStyle(wb));

文件下载方法 1:

先在服务器产生临时文件,再下载临时文件。

关闭保存excel文件 FileOutputStream fOut = new FileOutputStream(xlsFile); //创建xls文件,无内容 0字节 wb.write(fOut); //写内容,xls文件已经可以打开 fOut.flush(); //刷新缓冲区 fOut.close(); //关闭

文件下载方法 2:

//7.生成excel文件 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //生成流对象 wb.write(byteArrayOutputStream); //将excel写入流 ​ //工具类,封装弹出下载框: String outFile = "生产厂家通讯录.xls"; DownloadBaseAction down = new DownloadBaseAction(); down.download(byteArrayOutputStream, response, outFile);

文件下载方法 3:(适用于 struts2)

ServletActionContext.getResponse().setContentType("application/octet-stream"); String returnName = ServletActionContext.getResponse().encodeURL( new String("购销合同.xls".getBytes(), "ISO-8859-1")); ServletActionContext.getResponse().addHeader("Content-Disposition", "attachment;filename=" + returnName); ​ wb.write(ServletActionContext.getResponse().getOutputStream());

文件下载方法 4:

//下载文件 response.setContentType("application/octet-stream"); String returnName = response.encodeURL( new String("生产厂家通讯录.xls".getBytes(), "ISO-8859-1")); response.addHeader("Content-Disposition", "attachment;filename=" + returnName); ​ wb.write(response.getOutputStream());

字体修饰:

//设置单元格样式 private HSSFCellStyle leftStyle(HSSFWorkbook wb){ HSSFCellStyle curStyle = wb.createCellStyle(); HSSFFont curFont = wb.createFont(); //设置字体 //curFont.setFontName("Times New Roman"); //设置英文字体 curFont.setFontName("微软雅黑"); //设置英文字体 curFont.setCharSet(HSSFFont.DEFAULT_CHARSET); //设置中文字体,那必须还要再对单元格进行编码设置 curFont.setFontHeightInPoints((short)10); //字体大小 curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗 ​ curStyle.setFont(curFont); curStyle.setBorderTop(HSSFCellStyle.BORDER_THICK); //粗实线 curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //实线 curStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM); //比较粗实线 curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); //实线 curStyle.setWrapText(true); //换行 curStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT); //横向具右对齐 curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //单元格垂直居中 return curStyle; }

=================== web 环境 ===================

设置打印方向:默认纵向

PrintSetup ps = sheet.getPrintSetup();ps.setLandscape(true); //横向打印

自适应列宽://bug 对中文支持不好,列宽不够宽 for(int i=0 ;i<titles.length;i++){

sheet.autoSizeColumn((short)i);

}

设置行高:nRow.setHeightInPoints(18);

设置列宽:sheet.setColumnWidth((short)colNo, (short)(256*8));

设置每列默认宽度:sheet.setDefaultColumnWidth((short) 20);

设置标题:将第一行作为标题,即每页都打印此行 sheetN,startCol,stopCol,startRow,stopRow

wb.setRepeatingRowsAndColumns(0,1,8,0,1);

页脚:HSSFFooter footer = sheet.getFooter();footer.setRight("第"+HSSFFooter.page()+"页 共"+HSSFFooter.numPages()+"页 "); //页数

工具类-单元格自适应高度:float height = pioUtil.getCellAutoHeight(extcproducts, 12f);nRow.setHeightInPoints(height); //(一行字 + 行之间的间隙)*行数

分页:// POI 分页符有 BUG,必须在模板文件中插入一个分页符,然后再此处删除预设的分页符;最后在下面重新设置分页符。// sheet.setAutobreaks(false);// int iRowBreaks[] = sheet.getRowBreaks();// sheet.removeRowBreak(3);// sheet.removeRowBreak(4);// sheet.removeRowBreak(5);// sheet.removeRowBreak(6);

sheet.setRowBreak(行数); //在第 startRow 行设置分页符

==出货表:

合并单元格://纵向合并单元格 Region region = null;region = new Region(curRow-1, (short)(1), curRow-1+3, (short)1); sheet.addMergedRegion(region);

//横向合并单元格 CellRangeAddresssheet.addMergedRegion(new CellRangeAddress(开始行,结束行,开始列,结束列));

// 横向居中 style.setAlignment(CellStyle.ALIGN_CENTER); // 纵向居中 style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

文件直接输出:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //生成流对象 wb.write(byteArrayOutputStream); //将excel写入流 HttpServletResponse response = ServletActionContext.getResponse(); ​ //工具类,封装弹出下载框: DownloadBaseAction down = new DownloadBaseAction(); down.download(byteArrayOutputStream, response, outFile);

获取模板:

int curRow = 0; //当前行 int colNo = 1; //当前列 //得到模板路径 String rootPath = UtilFuns.getROOTPath(); String xlsFile = rootPath + "/make/xlsprint/tOUTPRODUCT.xls"; //新建临时目录,存放excel /root/web/tmpfile/yyyy-mm-dd/... String filePath = "/web/tmpfile/" + UtilFuns.sysDate()+"/"; File tmpDir = new File(rootPath + filePath); if(!tmpDir.exists()){ tmpDir.mkdirs(); //创建多级目录 } FileUtil fu = new FileUtil(); String sFile = fu.newFile(rootPath+filePath, "outproduct.xls"); //防止文件并发访问 String outFile = rootPath+filePath+sFile; //输出文件

==合同打印:

1、 分页

sheet.setRowBreak(当前行); //设置分页符

2、怎么插入一个图片 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //add picture

pioUtil.setPicture(wb, patriarch, rootPath+"make/xlsprint/logo.jpg", curRow, 2, curRow+4, 2);

3、怎么插入一条线

pioUtil.setLine(wb, patriarch, curRow, 2, curRow, 8); //draw line

4、设置数值类型 nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);

5、设置前导符

HSSFDataFormat format = wb.createDataFormat();return format.getFormat(""¥"#,###,##0.00"); // 设置格式

6、设置公式

nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);nCell.setCellFormula("F11*H11");nCell.setCellFormula("F"+String.valueOf(curRow)+"*H"+String.valueOf(curRow));

nCell.setCellFormula("SUM(I"+String.valueOf(curRow-4)+":I"+String.valueOf(curRow-1)+")");

7、工具类:替换等量空格

fixSpaceStr(String str,int len)

8、业务要求:1)同一个厂家的货物才能打印到同一个页面

List oList = oDao.find("from ContractProduct o where o.contract.id='"+contractId+"' order by o.factory.id,o.orderNo");

//厂家不同另起新页打印,除去第一次的比较 if(oProduct.getFactory().getFactoryName().equals(oldFactory)){ }

2)打印可以选择打印一款货物,还是两款货物 if(contract.getPrintStyle().equals("2")){}

9、数据和业务分离

//填写每页的内容,之后在循环每页读取打印 Map<String,String> pageMap = null;List pageList = new ArrayList(); //打印页

==报运打印:

wb.cloneSheet(0); //复制 sheet0 工作簿,名字会自动重命名

SpringMVC 的 POI 实现方式

//前端部分----goodsService.js----- this.exportExcel = function(){ window.open('../goods/export.do'); } //前端部分----goodsController.js----- $scope.exportExcel = function(){ goodsService.exportExcel(); } //后端部分 // 1.创建工作簿 Workbook wb = new HSSFWorkbook(); // 2.创建工作表 Sheet sheet = wb.createSheet(); // 3.设置一些参数,设置一些公用变量, 列宽就是个bug nRow = sheet.createRow(0); // 4.给行设置值 nCell = nRow.createCell(0); nCell.setCellValue("测试导出数据"); // 5.设置导出头信息,指定下载的文件名,写出excel try { response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("商品明细.xls","UTF-8")); OutputStream output = response.getOutputStream(); wb.write(output); output.flush(); output.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
  • POI
    23 引用 • 21 回帖
  • Excel
    31 引用 • 28 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone
    作者

    百万数据上传

  • visus

    真妹

  • someone
    作者

    你说啥?

  • visus

    真美~=真妹

  • someone

    你是个好人

  • someone
    作者

    哦,😰

  • PeterChu 3 评论

    哇塞,厉害哇!
    正好我现在需要一个导入 PDF 或者 WORD 的工具。
    情况是这样的,客户这有份 PDF(就是我们之前用过的那种高考志愿招生报考指南的 PDF 版),这份 PDF 恐怕还是扫描件,经处理后是可以得到可以读取文本的 PDF,或者 WORD、Excel 文件,但是其中存在各种文本识别错误,(甚至未识别某块区域中的文本,还是保存未一块图片,或者是某块区域识别为一个表格-word 中),
    然后,需要做的是:将得到的这份文件中的数据,存储到系统数据库表中,以供系统使用。

    样图:
    image.png

    这种情况不知到有哪个好用的工具 API 使用?或者有什么思路建议吗?

    我现在的思路是:应该可以根据文本的缩进、去区分文本内容的类型,然后进行存储,但是,如果其中包含了表格,就不太能想到怎么处理表格了。

    还有个 docx4j?不知道好用吗
    PeterChu
  • someone
    作者

    你需要把 pdf 转成 html

请输入回帖内容 ...

推荐标签 标签

  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • abitmean

    有点意思就行了

    37 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 146 关注
  • Follow
    4 引用 • 12 回帖 • 10 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 250 关注
  • Access
    1 引用 • 3 回帖 • 2 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    163 引用 • 309 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 657 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 668 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 8 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 629 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 626 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 104 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9637 引用 • 43815 回帖 • 95 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖