java导出word表格

Python015

java导出word表格,第1张

首先我用的技术是 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 = 0i <listParagraphs.size()i++) {

listRun = listParagraphs.get(i).getRuns()

for (int j = 0j <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 新生成的地址。

首先需加载你的SQLCUTE是不能错(指明点就是数据库的连接)创建的方法查询所有的数据:publicListAllObject()得到所有的数据,我们就可以开始了(最好是写在你的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=0i<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=nulltry{//输入文件is=newFileInputStream(file)}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace()}returnis//返回该输入流,完成}写完之后,可在servlet中直接调用,service中的getInputStream方法你可以写方法接收,也可以写流接收,因为过来的方法有返回值ISpublicInputStreamgetDownloadFile(){returniuserservice.getInputStream()}这里后面就是你自己的事勒,简单点就是重定向某个页面(查看成功啦)等等这有个弊端就是在Disk(磁盘)创建了多个文件,也就是不用的时候就是垃圾数据。实在有点勉强的话,加我 :236133039帮你解答(实战操作)