package com.wordProcess;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletContext;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class wordTool
{
private String modelPath;
private String outPath;
private ArrayList bmList;
double picRate;
public wordTool()
{
modelPath = "";
bmList = new ArrayList();
picRate = 566.225;
Properties pro = new Properties();
try
{
String url = this.getClass().getClassLoader().getResource("wordTool.properties").toString().substring(6);
String empUrl = url.replace("%20", " ");//
//empUrl = "D:/jboss/server/default/deploy/qxgl.war/WEB-INF/classes/wordTool.properties";
//empUrl = "D:/jakarta-tomcat-5.0.30/webapps/WordTest/WEB-INF/classes/wordTool.properties";
System.out.println(empUrl);
InputStream ins = new BufferedInputStream(new FileInputStream(empUrl));
pro.load(ins);
modelPath = pro.getProperty("file.ModelPath");
outPath = pro.getProperty("file.OutPath");
ins.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private boolean initBookMark(String modelFile)
{
bmList.clear();
modelFile = modelFile.substring(0, modelFile.indexOf(".rtf"));
String xmlFile = modelPath + modelFile + ".xml";
try
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xmlFile);
Element pEle = document.getRootElement();
List list = pEle.elements();
Iterator iter=list.iterator();
List eList;
int i;
Element bmElement, chElement;
while(iter.hasNext())
{
bmElement=(Element)iter.next();
eList = bmElement.elements();
for(i=0; i<eList.size(); i++)
{
chElement = (Element)(eList.get(i));
if(chElement.getName() != "Type")
continue;
setBookMark(bmElement, Integer.parseInt(chElement.getData().toString()));
}
}
}
catch(Exception e)
{
e.printStackTrace();
System.out.println("书签信息初始化失败!");
return false;
}
return true;
}
private void setBookMark(Element eleBm, int nType)
{
int i, j;
Element eleCh,eleCol;
List eList = eleBm.elements();
List colList;
bookMark bm = new bookMark();
bm.nType = nType;
for(i=0; i<eList.size(); i++)
{
eleCh = (Element)(eList.get(i));
if(eleCh.getName() == "Name")
{
bm.strBookMark = eleCh.getData().toString();
continue;
}
switch(nType)
{
case 1:
if(eleCh.getName() == "Width")
bm.dWidth = Double.parseDouble(eleCh.getData().toString());
if(eleCh.getName() == "Height")
bm.dHeight = Double.parseDouble(eleCh.getData().toString());
break;
case 2:
colList = eleCh.elements();
for(j=0; j<colList.size(); j++)
{
eleCol = (Element)colList.get(j);
bm.colList.add(Integer.parseInt(eleCol.getData().toString()));
}
break;
}
}
bmList.add(bm);
}
public String generateWord(Hashtable hTable, String modelFile)
{
if(false == initBookMark(modelFile))
return null;
String outFile = modelFile;
modelFile = modelPath + modelFile;
InputStream ins;
int nRead;
String strModel = "";
try
{
ins = new FileInputStream(modelFile);
if(ins == null)
{
System.out.println("模板文件不存在!");
return null;
}
byte[] bList = new byte[1638400];
while((nRead = ins.read(bList,0,1638400)) != -1)
{
strModel += new String(bList, 0, nRead);
}
ins.close();
}
catch(Exception e)
{
e.printStackTrace();
}
bookMark bm;
for(int i=0; i<bmList.size(); i++)
{
bm = (bookMark)(bmList.get(i));
if(hTable.get(bm.strBookMark) == null)
continue;
strModel = strModel.replace(GetBookMark(bm.strBookMark), GetRtfStr(bm.nType,hTable.get(bm.strBookMark),bm));
}
Date current=new Date();
SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strTemp = sdf.format(current);
//targetname = sdf.format(current).substring(11,13) + "时";
//targetname += sdf.format(current).substring(14,16) + "分";
//targetname += sdf.format(current).substring(17,19) + "秒";
String targetname = strTemp.substring(0,10) + strTemp.substring(11,13) + strTemp.substring(14,16) + strTemp.substring(17,19);
targetname += "_"+outFile;
try
{
String savePath = getSavePath();
FileWriter fw = new FileWriter(savePath + "\\" + targetname,true);
PrintWriter out = new PrintWriter(fw);
out.println(strModel);
out.close();
fw.close();
System.out.println(savePath+" 该目录下生成文件" + targetname + " 成功");
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
return targetname;
}
private String GetBookMark(String bmName)
{
String bm;
bm = "{\\*\\bkmkstart "+bmName+"}{\\*\\bkmkend "+bmName+"}";
return bm;
}
private String GetRtfStr(int nType, Object pObject, bookMark bm)
{
String strRtf = "";
switch(nType)
{
case 0:
strRtf = strToRtf((String)pObject);
break;
case 1:
strRtf = GetPicRtf((String)pObject, bm);
break;
case 2:
strRtf = GetTbRtf((ArrayList)pObject, bm);
break;
default:
strRtf = (String)pObject;
break;
}
return strRtf;
}
private String strToRtf(String content)
{
if(content.equals(null))
return "";
StringBuffer sb = new StringBuffer("");
try
{
char[] digital = "0123456789ABCDEF".toCharArray();
byte[] bs = content.getBytes();
int inext = 0;
int bit;
for (int i = 0; i < bs.length; i++)
{
bit = (bs[i] & 0x0f0) >> 4;
if(bs[i]>0 && inext == 0)
{
sb.append("\\'");
}
else
{
if(inext == 0)
sb.append("\\dbch\\f31505");
sb.append("\\'");
if(inext == 0)
inext = 1;
else
inext = 2;
}
sb.append(digital[bit]);
bit = bs[i] & 0x0f;
sb.append(digital[bit]);
if(inext > 1)
{
sb.append("\\loch\\f31505");
inext=0;
}
}
}
catch(Exception e)
{
System.out.print(content);
return "";
}
return sb.toString();
}
private String strToRtf(String content, int nFlag)
{
if(content == null)
return "";
StringBuffer sb = new StringBuffer("");
try
{
char[] digital = "0123456789ABCDEF".toCharArray();
byte[] bs = content.getBytes();
int inext = 0;
int bit;
sb.append("{");
for (int i = 0; i < bs.length; i++)
{
bit = (bs[i] & 0x0f0) >> 4;
if(bs[i]>0 && inext == 0)
{
if(nFlag == 1)
sb.append("\\b");
sb.append("\\'");
}
else
{
if(inext == 0)
{
sb.append("\\dbch\\f31505");
if(nFlag == 1)
sb.append("\\b");
}
sb.append("\\
在Java编程环境中,处理Microsoft Word文档通常涉及到使用第三方库,如Apache POI或者JODConverter。这些库允许开发者以编程方式读取、修改和创建Word文档。本篇将深入探讨如何利用Java根据Word文档中的标签来写入相应信息,以及涉及的相关技术与步骤。 Apache POI是Java中广泛使用的库,它支持读写Microsoft Office格式的文件,包括Word(.doc和.docx)。对于.docx文件,Apache POI提供了XWPFDocument类来处理。下面是一些关键步骤: 1. **导入必要的库**:在项目中引入Apache POI库,如果是Maven项目,可以在pom.xml文件中添加依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. **创建或打开Word文档**:使用`XWPFDocument`类实例化一个Word文档对象。如果文件不存在,可以使用`XWPFDocument.createParagraph()`方法创建新的段落。 3. **查找标签**:在Word文档中,标签通常是以特定格式(如`<<name>>`)存在的文本,可以通过遍历文档的每个段落和运行(`XWPFParagraph`和`XWPFRun`)来寻找这些标签。例如: ```java for (XWPFParagraph paragraph : document.getParagraphs()) { for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); if (text.contains("<<name>>")) { // 找到标签,进行替换操作 } } } ``` 4. **替换标签**:找到标签后,可以使用`XWPFRun.setText()`方法替换标签内容。确保保留原始格式,例如字体、颜色等: ```java String replacementText = "张三"; run.setText(replacementText, 0); ``` 5. **保存更改**:完成所有替换后,调用`document.write()`方法将更改保存到文件: ```java try (FileOutputStream out = new FileOutputStream("output.docx")) { document.write(out); } ``` 除了基本的替换操作,还可以实现更复杂的功能,比如条件判断、循环结构,以及对表格、图片和页眉页脚的处理。此外,还可以结合模板引擎,如FreeMarker或Velocity,来提高代码的可读性和灵活性。 通过Java和Apache POI库,我们可以实现根据Word文档中的标签动态插入数据,这对于批量生成报告、自定义模板等场景非常有用。但要注意,处理大文件时可能会消耗大量内存,因此需要合理设计代码以优化性能。同时,由于Word的复杂性,某些高级功能可能需要更深入的研究和实验。










































































































- 1

- 粉丝: 0
- 资源: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助



最新资源
- 教育培训学校的网络推广方案.doc
- 教育信息化2.doc
- 框架采购软件.docx
- 旅游电子商务项目商业计划书.doc
- 教育信息化工作规划.doc
- 旅游电子商务心得体会.doc
- 模具项目管理流程.doc
- 某隧道工程项目管理机构及职能组成模式.doc
- 普测计算机应用基础判断100题(附答案).doc
- 某中小企业网站运营数据分析实例.doc
- 攀枝花市继续教育人工智能与健康考试题及答案.doc
- 施工进度网络计划、关键节点和关键线路的保证措施.doc
- 普通信签纸模板.doc
- 施工单位及其项目管理机构自查自纠记录表空.doc
- 施工项目管理系列之施工项目组织协调.doc
- 施工项目管理工作流程及详细内容要求修改.doc



- 1
- 2
- 3
前往页