Java中用Apache POI生成excel和word文档
概述:
近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能。最后决定用Apache POI来完毕该项功能。本文就项目实现过程中的一些思路与代码与大家共享。同一时候。也作为自己的一个总结。以备后用。
功能:
1、从数据库查询数据导出为excel;
2、导出word的包含,内容有文字。图片,表格等。
效果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR0lTU2hpWGlTaGVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
导出excel
导出word
实现代码:
1、导出excel
package beans.excel; import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class CreateSimpleExcelToDisk
{
/**
* @功能:手工构建一个简单格式的Excel
*/
private static List<Student> getStudent() throws Exception
{
List<Student> list = new ArrayList<Student>();
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd"); Student user1 = new Student(1, "张三", 16, df.parse("1997-03-12"));
Student user2 = new Student(2, "李四", 17, df.parse("1996-08-12"));
Student user3 = new Student(3, "王五", 26, df.parse("1985-11-12"));
list.add(user1);
list.add(user2);
list.add(user3); return list;
} @SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception
{
// 第一步,创建一个webbook,相应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步。在webbook中加入一个sheet,相应Excel文件里的sheet
HSSFSheet sheet = wb.createSheet("学生表一");
// 第三步,在sheet中加入表头第0行,注意老版本号poi对Excel的行数列数有限制short
HSSFCellStyle headStyle = wb.createCellStyle();
HSSFFont f = wb.createFont();
f.setFontHeightInPoints((short) 11);// 字号
f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
headStyle.setFont(f);
headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
headStyle.setBorderBottom((short) 1);
headStyle.setBorderRight((short) 1);
headStyle.setFillBackgroundColor((short) 20);
HSSFRow row = sheet.createRow((int) 0);
// 第四步。创建单元格。并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
style.setBorderBottom((short) 1);
style.setBorderRight((short) 1);
String[] header = new String[]{"学号","姓名","年龄","生日"};
HSSFCell cell = null;
for(int i=0;i<header.length;i++){
cell = row.createCell((short) i);
cell.setCellValue(header[i]);
cell.setCellStyle(headStyle);
sheet.setColumnWidth(i, 5000);
}
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
List<Student> list = CreateSimpleExcelToDisk.getStudent();
for (int i = 0; i < list.size(); i++)
{
row = sheet.createRow((int) i + 1);
Student stu = (Student) list.get(i);
// 第四步,创建单元格,并设置值
cell = row.createCell((short) 0);
cell.setCellValue(stu.getId());
cell.setCellStyle(style);
cell = row.createCell((short) 1);
cell.setCellValue(stu.getName());
cell.setCellStyle(style);
cell = row.createCell((short) 2);
cell.setCellValue(stu.getAge());
cell.setCellStyle(style);
cell = row.createCell((short) 3);
cell.setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(stu.getBirth()));
cell.setCellStyle(style);
}
// 第六步,将文件存到指定位置
try
{
FileOutputStream fout = new FileOutputStream("D:/students.xls");
wb.write(fout);
fout.close();
System.out.println("输出成功。");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
当中,student类的代码例如以下:
package beans.excel; import java.util.Date; public class Student {
private int id;
private String name;
private int age;
private Date birth; public Student()
{
} public Student(int id, String name, int age, Date birth)
{
this.id = id;
this.name = name;
this.age = age;
this.birth = birth;
} public int getId()
{
return id;
} public void setId(int id)
{
this.id = id;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int getAge()
{
return age;
} public void setAge(int age)
{
this.age = age;
} public Date getBirth()
{
return birth;
} public void setBirth(Date birth)
{
this.birth = birth;
}
}
2、导出word报告
package beans.excel; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger; import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; public class ExportDocTest {
public static void main(String[] args) throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFParagraph para;
XWPFRun run;
//加入文本
String content =" 额尔古纳河在1689年的《中俄尼布楚条约》中成为中国和俄罗斯的界河。额尔古纳河上游称海拉尔河。源于大兴安岭西側,西流至阿该巴图山脚, 折而北行始称额尔古纳河。额尔古纳河在黑龙江省漠河县以西的内蒙古自治区额尔古纳右旗的恩和哈达附近与流经俄罗斯境内的石勒喀河汇合后始称黑龙江。 沿额尔古纳河沿岸地区土地肥沃。森林茂密,水草丰美, 鱼类品种非常多,动植物资源丰富。宜农宜木。是人类理想的天堂。";
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.LEFT);//设置左对齐
run = para.createRun();
run.setFontFamily("仿宋");
run.setFontSize(13);
run.setText(content);
doc.createParagraph();
//加入图片
String[] imgs = {"D:\\bar.png","D:\\pie.png"};
for(int i=0;i<imgs.length;i++){
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);//设置左对齐
run = para.createRun();
InputStream input = new FileInputStream(imgs[i]);
run.addPicture(input, XWPFDocument.PICTURE_TYPE_JPEG,
imgs[i], Units.toEMU(350), Units.toEMU(170));
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);//设置左对齐
run = para.createRun();
run.setFontFamily("仿宋");
run.setFontSize(11);
run.setText(imgs[i]);
}
doc.createParagraph(); //加入表格
XWPFTable table = doc.createTable(2,3);
table.setCellMargins(3, 5, 3, 5);
// table.addNewCol();//加入新列
// table.createRow();//加入新行
String[] title = new String[]{"境内河流","境外河流","合计"};
String[] value = new String[]{"1","2","3"};
XWPFTableRow row;
XWPFTableCell cell;
CTTcPr cellPr;
for(int j=0;j<2;j++){
row = table.getRow(j);
row.setHeight(400);
for(int i=0;i<title.length;i++){
cell = row.getCell(i);
cellPr = cell.getCTTc().addNewTcPr();
cellPr.addNewTcW().setW(BigInteger.valueOf(3000));
para = cell.getParagraphs().get(0);
para.setAlignment(ParagraphAlignment.CENTER);
run = para.createRun();
run.setFontFamily("仿宋");
run.setFontSize(11);
if(j==0){//标题
run.setBold(true);
run.setText(title[i]);
}
else{
run.setText(value[i]);
}
}
}
String path = "D:\\test.doc";
OutputStream os = new FileOutputStream(path);
doc.write(os);
if(os!=null){
try{
os.close();
System.out.println("文件已输出!");
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
3、word模板替换
word模板
替换后效果
代码:
package beans.excel; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow; public class ExportWordTest {
public static void main(String[] args) throws Exception, IOException {
Map<String, Object> map=new HashMap<String, Object>();
String sum = "额尔古纳河在1689年的《中俄尼布楚条约》中成为中国和俄罗斯的界河。额尔古纳河上游称海拉尔河,源于大兴安岭西側,西流至阿该巴图山脚, 折而北行始称额尔古纳河。 额尔古纳河在黑龙江省漠河县以西的内蒙古自治区额尔古纳右旗的恩和哈达附近与流经俄罗斯境内的石勒喀河汇合后始称黑龙江。 沿额尔古纳河沿岸地区土地肥沃。森林茂密,水草丰美, 鱼类品种非常多,动植物资源丰富。宜农宜木。是人类理想的天堂。 ";
map.put("basin", "额尔古纳河流域");
map.put("sum", sum);
map.put("jnhl", "1");
map.put("jwhl", "1");
map.put("jnhp", "1");
map.put("jwhp", "1");
map.put("jnsk", "1");
map.put("jwsk", "1");
map.put("hj", "6");
//注意biyezheng_moban.doc文档位置,此例中为应用根文件夹
XWPFDocument doc=new ExportWordTest().replaceDoc("D:\\word_temp.docx", map);
try {
OutputStream os = new FileOutputStream("D:\\tttt.doc");
doc.write(os);
os.close();
System.out.println("输出成功!");
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取word模板并替换变量
* @param srcPath
* @param map
* @return
*/
public XWPFDocument replaceDoc(String srcPath, Map<String, Object> param) {
try {
// 读取word模板
InputStream fis = new FileInputStream(srcPath);
XWPFDocument doc = new XWPFDocument(fis);
//处理段落
List<XWPFParagraph> paragraphList = doc.getParagraphs();
processParagraph(paragraphList,doc,param);
//处理表格
Iterator<XWPFTable> it = doc.getTablesIterator();
while (it.hasNext()) {
XWPFTable table = it.next();
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
List<XWPFParagraph> paragraphListTable = cell.getParagraphs();
processParagraph(paragraphListTable, doc, param);
}
}
}
return doc;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
} public void processParagraph(List<XWPFParagraph> paragraphList,
XWPFDocument doc,Map<String, Object> param){
if(paragraphList != null && paragraphList.size() > 0){
for(XWPFParagraph paragraph:paragraphList){
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
String text = run.getText(0);
if(text != null){
boolean isSetText = false;
for (Entry<String, Object> entry : param.entrySet()) {
String key = entry.getKey();
if(text.indexOf(key) != -1){
isSetText = true;
Object value = entry.getValue();
if (value instanceof String) {//文本替换
text = text.replace(key, value.toString());
System.out.println(text);
}
else{
text = text.replace(key, "");
}
}
}
if(isSetText){
run.setText(text,0);
}
}
}
}
}
}
}
POI相关jar包和API下载地址:http://pan.baidu.com/s/1eQ6fE8a
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR0lTU2hpWGlTaGVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Java中用Apache POI生成excel和word文档的更多相关文章
- poi根据模板导出word文档
POI结构与常用类 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...
- 自动生成并导出word文档
今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...
- ASPOSE.Cells & ASPOSE.Words 操纵Excel和Word文档的 .NET Core 实例
Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,它提供的原生API可以对Word.Excel.PDF.Powerpoint.Outlook.CAD.图片.3D.ZI ...
- 一键批量打印EXCEL、WORD文档
一键批量打印EXCEL.WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3.A4文档,包括单.双面打印等.希望能帮到广大朋友.请大家注重原创版权,不得在未经许可的下转载.传播,或者用来对同 ...
- 使用 powerdesigner 将数据库表结构逆向工程生成对应的word文档
本机系统win10 + mysql 5.7.17 + powerDesigner 16.5 + mysql-connector-odbc-5.3.9-winx32.msi 1 使用 PowerDesi ...
- powerdesigner连接postgresql数据库生成pdm及word文档
1.准备软件: powerdesigner165与postgresql的驱动:psqlodbc_11_01_0000 2.安装并破解完成powerdesigner165 参看链接:https://ww ...
- 使用Java POI来选择提取Word文档中的表格信息
通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...
- 利用POI操作不同版本号word文档中的图片以及创建word文档
我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...
- C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
使用NPOI可以方便的实现服务端对Word.Excel的读写.要实现对Word的读写操作,需要引用NPOI.OOXML.dll,应用命名空间XWPF. 本文使用NPOI 2.0实现对Word的基本生成 ...
随机推荐
- JavaNIO阻塞IO
package com.java.NIO; import java.io.IOException; import java.net.InetSocketAddress; import java.nio ...
- Fiddler手机抓包图文教程
上篇Fiddler教程,我们教了大家Fiddler安装配置及如何使用Fiddler进行基本的Http抓包及模拟请求,今天给大家介绍下如何使用Fiddler进行手机抓包. 运行环境为Windows 10 ...
- Remove Untagged Images From Docker
I've been playing around a lot with docker. It's awesome, and it creates a whole new world of possib ...
- 部署 Graylog 日志系统 - 每天5分钟玩转 Docker 容器技术(92)
Graylog 是与 ELK 可以相提并论的一款集中式日志管理方案,支持数据收集.检索.可视化 Dashboard.本节将实践用 Graylog 来管理 Docker 日志. Graylog 架构 G ...
- The Lisp Curse /Lisp魔咒
The Lisp Curse /Lisp魔咒 http://winestockwebdesign.com/Essays/Lisp_Curse.html 英文出处 http://www.soimort. ...
- c#简单实现二维数组和二维数组列表List<>的转置
刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...
- linux系统下手动安装Angular-cli
安装Angular-cli 背景 由于公司linux服务器没有外网,无法通过npm包管理器直接安装,只能手动安装一个Angular-cli平台环境! 安装步骤 1. 先再linux系统下安装好node ...
- 深度学习之tensorflow (一)
一.TensorFlow简介 1.TensorFlow定义: tensor :张量,N维数组 Flow : 流,基于数据流图的计算 TensorFlow : 张量从图像的一端流动到另一端的计算 ...
- innobackupex: fatal error: no ‘innodb_buffer_pool_filename’解决方法
http://www.ttlsa.com/mysql/innobackupex-1-5-1-fatal-error-no-innodb_buffer_pool_filename/
- git命令提交项目
相关的操作命令,总是忘记,故在此记录下: 此为linux下的命, windows的话,去掉sudo即可 1.进入项目代码根目录,执行: sudo git init 把这个目录变成git可以管理的仓库. ...