乔山办公网我们一直在努力
您的位置:乔山办公网 > word文档 > 怎么通过<em>JAVA</em>往WORD的里写一张带数据表格?-java word导出表格,

怎么通过<em>JAVA</em>往WORD的里写一张带数据表格?-java word导出表格,

作者:乔山办公网日期:

返回目录:word文档


首先我用的技术是 poi

这是代码,一个工具类得调用
public class WordUtil {
/**
* 基于模板文件导出 word 文档,此方法主要是用来处理文档中需要替换的文本内容,对图片和表格无效
*
* @param templatePath
* 模板文件的路径,要求路径中要包含全名,并且模板文件只能是 07 及以上格式,即 docx 的文件
* @param destFilePath
* 导出文件的存放路径,包含文件名,例如,E:/test/小区公告.docx
* @param data
* 用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void exportWordByTemplate(String templatePath,
String destFilePath, Map<String, String> data) {
FileOutputStream out = null;
XWPFDocument doc = null;
try {
doc = new XWPFDocument(POIXMLDocument.openPackage(templatePath));
List<XWPFRun> listRun;
List<XWPFParagraph> listParagraphs = doc.getParagraphs();
for (int i = 0; i < listParagraphs.size(); i++) {

listRun = listParagraphs.get(i).getRuns();
for (int j = 0; j < listRun.size(); j++) {
if (data.get(listRun.get(j).getText(0)) != null) {
String val = data.get(listRun.get(j).getText(0));
listRun.get(j).setText(val, 0);
}
}
}
File destFile = new File(destFilePath);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
out = new FileOutputStream(destFilePath);
doc.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 基于模板文件导出 word 文档,该方法支持03格式,但是此方法只能保留文档内容,不能保留文档中的样式和图片,建议将模板使用 07 的格式保存
*
* @param templatePath
* 模板文件的路径
* @param destFilePath
* 导出文件的存放路径,包含文件名,例如,E:/test/小区公告.doc
* @param data
* 用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void export03WordByTemplate(String templatePath,
String destFilePath, Map<String, String> data) {
try {
WordExtractor doc = new WordExtractor(new FileInputStream(
templatePath));
String content = doc.getText();
for (String key : data.keySet()) {
content = content.replaceAll(key, data.get(key));
}
byte b[] = content.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
directory.createDocument("WordDocument", bais);
FileOutputStream ostream = new FileOutputStream(destFilePath);

fs.writeFilesystem(ostream);
bais.close();
ostream.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
Map<String, String> maps = new HashMap<String, String>();
maps.put("appellation", "万达公寓业e69da5e6ba90e79fa5e98193361主:");
maps.put(
"main_body",
"输出的内容");
maps.put("date", "2013年1月23日");
exportWordByTemplate("E:/sss 2.docx", "E:/test/test.doc", maps);

}
}
"E:/sss 2.docx 模板存放的地址。
E:/test/test.doc 新生成的地址。

首先需加载你的SQLCUTE是不能错(指明点就是数据库的连接)创建的方法查询所有的数据:publicListAllObject();得到所有的数据,我们e799bee5baa6e997aee7ad94e58685e5aeb9330就可以开始了(最好是写在你的Service中)创建表格输出的方法(我们的数据肯定是以流的形式写进写出的,表明点就是下载该文件\\恩文件上传下载应该会吧)好话不多说,开始工程在service中定义方法:publicInputStreamgetInputStream(){//为了好看点我就采用和word同类的软件exel//相当于我们创建的exel的窗体,可以查看exel的表格样式就是.xslHSSFWorkbookwb=newHSSFWorkbook();//创建sheet1一般我们的exel默认的有三个exelHSSFSheeths=wb.createSheet("sheet1");//创建row行HSSFRowhr=hs.createRow(0);//创建单元格HSSFCellhc=hr.createCell((short)0);//设置单元格的编码hc.setEncoding(HSSFCell.ENCODING_UTF_16);//设置表头的value的值hc.setCellValue("ID");//还要创建多个表头的值hc=hr.createCell((short)1);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue("姓");hc=hr.createCell((short)2);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue("名");hc=hr.createCell((short)3);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue("年龄");//从数据库中查出所有的用户Listls=iuserdao.AllListUser();//便利所有的数据for(inti=0;i<ls.size();i++){//得到第i个数据Userus=ls.get(i);//把数据放入表格中i是从0开始读取所以我们加一hr=hs.createRow(i+1);//设置编码hc=hr.createCell((short)0);hc.setEncoding(HSSFCell.ENCODING_UTF_16);//设置序号也就是在ID下的值,同样的是从0开始hc.setCellValue(i+1);//我们已经从数据库中获得了数据,所以我们可以从user中取出hc=hr.createCell((short)1);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue(us.getUname());hc=hr.createCell((short)2);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue(us.getSuname());hc=hr.createCell((short)3);hc.setEncoding(HSSFCell.ENCODING_UTF_16);hc.setCellValue(us.getAge());}//这里是在硬盘上创建一个临时文件用于用户下载,这是第一种方法//放入文件,所以必须创建个文件StringfileName=com.test.util.CUtils.getRandomString(5);//上面的文件名是用随机数写的,这样就会没相同的文件,便于输写fileName=newStringBuffer().append(fileName).append(".xls").toString();finalFilefile=newFile(fileName);//将文件输出到我们的硬盘try{OutputStreamos=newFileOutputStream(file);//把我们的数据输出到我们的HSSFWookbook中,以写入文件中wb.write(os);os.close();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}//构建个输入流InputStreamis=null;try{//输入文件is=newFileInputStream(file);}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnis;//返回该输入流,完成}写完之后,可在servlet中直接调用,service中的getInputStream方法你可以写方法接收,也可以写流接收,因为过来的方法有返回值ISpublicInputStreamgetDownloadFile(){returniuserservice.getInputStream();}这里后面就是你自己的事勒,简单点就是重定向某个页面(查看成功啦)等等这有个弊端就是在Disk(磁盘)创建了多个文件,也就是不用的时候就是垃圾数据。实在有点勉强的话,加我 :236133039帮你解答(实战操作)
1.读取word 2003及word 2007需要的jar包
  读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi-3.5-beta6-20090622.jar 和 poi-scratchpad-3.5-beta6-20090622.jar 两个 jar 包即可, 而 2007 版本(.docx)就麻烦多,我说的这个麻烦不是我们写代码的时候麻烦,是要导入的 jar 包比较的多,有如下 7 个之多:
1. openxml4j-bin-beta.jar
2. poi-3.5-beta6-20090622.jar
3. poi-ooxml-3.5-beta6-20090622.jar
4 .dom4j-1.6.1.jar
5. geronimo-stax-api_1.0_spec-1.0.jar
6. ooxml-schemas-1.0.jar
7. xmlbeans-2.3.0.jar
其中 4-7 是 poi-ooxml-3.5-beta6-20090622.jar 所依赖的 jar 包(在 poi-bin-3.5-beta6-20090622.tar.gz 中的 ooxml-lib 目录下可以找到)。e799bee5baa6e4b893e5b19e331
2.换行符号
  硬换行:文件中换行,如果是键盘中使用了"enter"的换行。
  软换行:文件中一行的字符数容量有限,当字符数量超过一定值时,会自动切到下行显示。
  对程序来说,硬换行才是可以识别的、确定的换行,软换行与字体大小、缩进有关。
3.读取的注意事项
  值得注意的是: POI 在读取不会读取 word 文件中的图片信息; 还有就是对于 2007 版的 word(.docx), 如果 word 文件中有表格,所有表格中的数据都会在读取出来的字符串的最后。
4.读取word文本内容代码

1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.InputStream;
4
5 import org.apache.poi.POIXMLDocument;
6 import org.apache.poi.POIXMLTextExtractor;
7 import org.apache.poi.hwpf.extractor.WordExtractor;
8 import org.apache.poi.openxml4j.opc.OPCPackage;
9 import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
10
11 public class Test {
12 public static void main(String[] args) {
13 try {
14 InputStream is = new FileInputStream(new File("2003.doc"));
15 WordExtractor ex = new WordExtractor(is);
16 String text2003 = ex.getText();
17 System.out.println(text2003);
18
19 OPCPackage opcPackage = POIXMLDocument.openPackage("2007.docx");
20 POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
21 String text2007 = extractor.getText();
22 System.out.println(text2007);
23
24 } catch (Exception e) {
25 e.printStackTrace();
26 }
27 }
28 }

首先我用的技术是 poi

这是代码,一个工具类得调用
public class WordUtil {
/**
* 基于模板文件导出 word 文档,此方法主要是用来处理文档中需要替换的文本内容,对图片和表格无效
*
* @param templatePath
* 模板文件的路径,要求路径中要包含全名,并且模板文件只能是 07 及以上格式,即 docx 的文件
* @param destFilePath
* 导出文件的存放路径,包含文件名,例如,E:/test/小区7a64e59b9ee7ad94337公告.docx
* @param data
* 用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void exportWordByTemplate(String templatePath,
String destFilePath, Map<String, String> data) {
FileOutputStream out = null;
XWPFDocument doc = null;
try {
doc = new XWPFDocument(POIXMLDocument.openPackage(templatePath));
List<XWPFRun> listRun;
List<XWPFParagraph> listParagraphs = doc.getParagraphs();
for (int i = 0; i < listParagraphs.size(); i++) {

listRun = listParagraphs.get(i).getRuns();
for (int j = 0; j < listRun.size(); j++) {
if (data.get(listRun.get(j).getText(0)) != null) {
String val = data.get(listRun.get(j).getText(0));
listRun.get(j).setText(val, 0);
}
}
}
File destFile = new File(destFilePath);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
out = new FileOutputStream(destFilePath);
doc.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 基于模板文件导出 word 文档,该方法支持03格式,但是此方法只能保留文档内容,不能保留文档中的样式和图片,建议将模板使用 07 的格式保存
*
* @param templatePath
* 模板文件的路径
* @param destFilePath
* 导出文件的存放路径,包含文件名,例如,E:/test/小区公告.doc
* @param data
* 用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void export03WordByTemplate(String templatePath,
String destFilePath, Map<String, String> data) {
try {
WordExtractor doc = new WordExtractor(new FileInputStream(
templatePath));
String content = doc.getText();
for (String key : data.keySet()) {
content = content.replaceAll(key, data.get(key));
}
byte b[] = content.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
directory.createDocument("WordDocument", bais);
FileOutputStream ostream = new FileOutputStream(destFilePath);

fs.writeFilesystem(ostream);
bais.close();
ostream.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
Map<String, String> maps = new HashMap<String, String>();
maps.put("appellation", "万达公寓业主:");
maps.put(
"main_body",
"输出的内容");
maps.put("date", "2013年1月23日");
exportWordByTemplate("E:/sss 2.docx", "E:/test/test.doc", maps);

}
}
"E:/sss 2.docx 模板存放的地址。
E:/test/test.doc 新生成的地址。

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网