常用 POI 方法

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

目前常见读写 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(); }

相关帖子

欢迎来到这里!

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

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

    哦,😰

  • 其他回帖
  • someone
    作者

    你说啥?

  • PeterChu 3 评论

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

    样图:
    image.png

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

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

    还有个 docx4j?不知道好用吗
    PeterChu
  • 查看全部回帖

推荐标签 标签

  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 75 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 117 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • JVM

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

    180 引用 • 120 回帖 • 1 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 171 关注
  • CodeMirror
    2 引用 • 17 回帖 • 164 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 3 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 7 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 834 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖 • 1 关注
  • 区块链

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

    92 引用 • 752 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 634 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 25 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 634 关注
  • V2Ray
    1 引用 • 15 回帖 • 3 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 4 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • LeetCode

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

    209 引用 • 72 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 63 关注
  • OpenStack

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

    10 引用 • 3 关注