概述:

近期在做项目的过程中遇到了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文档的更多相关文章

  1. poi根据模板导出word文档

    POI结构与常用类 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...

  2. 自动生成并导出word文档

    今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...

  3. ASPOSE.Cells & ASPOSE.Words 操纵Excel和Word文档的 .NET Core 实例

    Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,它提供的原生API可以对Word.Excel.PDF.Powerpoint.Outlook.CAD.图片.3D.ZI ...

  4. 一键批量打印EXCEL、WORD文档

    一键批量打印EXCEL.WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3.A4文档,包括单.双面打印等.希望能帮到广大朋友.请大家注重原创版权,不得在未经许可的下转载.传播,或者用来对同 ...

  5. 使用 powerdesigner 将数据库表结构逆向工程生成对应的word文档

    本机系统win10 + mysql 5.7.17 + powerDesigner 16.5 + mysql-connector-odbc-5.3.9-winx32.msi 1 使用 PowerDesi ...

  6. powerdesigner连接postgresql数据库生成pdm及word文档

    1.准备软件: powerdesigner165与postgresql的驱动:psqlodbc_11_01_0000 2.安装并破解完成powerdesigner165 参看链接:https://ww ...

  7. 使用Java POI来选择提取Word文档中的表格信息

    通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...

  8. 利用POI操作不同版本号word文档中的图片以及创建word文档

    我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...

  9. C# WebForm 使用NPOI 2 生成简单的word文档(.docx)

    使用NPOI可以方便的实现服务端对Word.Excel的读写.要实现对Word的读写操作,需要引用NPOI.OOXML.dll,应用命名空间XWPF. 本文使用NPOI 2.0实现对Word的基本生成 ...

随机推荐

  1. Spring AOP分析(2) -- JdkDynamicAopProxy实现AOP

    上文介绍了代理类是由默认AOP代理工厂DefaultAopProxyFactory中createAopProxy方法产生的.如果代理对象是接口类型,则生成JdkDynamicAopProxy代理:否则 ...

  2. 《剑指offer》面试题的Python实现

    <剑指Offer>是很多程序员面试前要看的书,但里面的算法都是基于C++实现的,最近用了三周左右时间,用Python完成了里面几乎所有的算法题,由于时间以及个人水平均有限,或许会有部分问题 ...

  3. Erlang Concurrent 并发进阶

    写在前面的话 本文来源于官方教程 Erlang -- Concurrent Programming.虽然没有逻辑上的关系,但建议在掌握了Erlang入门系列教程的一些前置知识后继续阅读. 之前我是逐小 ...

  4. C语言的第一个程序 “hello world!”

    1,C语言的简介        C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. ...

  5. Python之re正则模块

    正则表达式可以帮助我们更好的描述复制的文本格式,可以更好地利用它们对文本数据进行检索.替换.提取和修改操作. http://www.cnblogs.com/huxi/archive/2010/07/0 ...

  6. CocoaPods 安装及使用

    1.开启 terminal 2.移除现有 Ruby 默认源 $ gem sources --remove https://rubygems.org/ 3.使用新的源 $ gem sources -a ...

  7. linux 安装nginx 详解

    1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...

  8. one 策略模式 strategy

    --读书笔记 定义 策略模式--定义算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.(看不懂的话,往下,有人话版/我自己的解释) 相关原则 > 1,变化单独 ...

  9. Mybatis(一)实现单表的增删改查

    1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  10. Numpy入门 - 数组切片操作

    本节主要演示数组的切片操作,数组的切片操作有两种形式:更改原数组的切片操作和不更改原数组的切片操作. 一.更改原数组的切片操作 import numpy as np arr = np.array([1 ...