ZipFile docxFile = new ZipFile(new File("c:/3.docx"));
ZipEntry documentXML = docxFile.getEntry("word/document.xml");
InputStream documentXMLIS = docxFile.getInputStream(documentXML);
String s = "";
InputStreamReader reader = new InputStreamReader(documentXMLIS,"UTF-8");
BufferedReader br = new BufferedReader(reader);
String str = null;
while ((str = br.readLine()) != null) {
s = s+str;
}
s = s.replaceAll("${key}", "替换内容");
System.out.println(s);
reader.close();
br.close();
if(true){
//return;
}
//ZipEntry imgFile = docxFile.getEntry("word/media/image1.png");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
InputStream documentXMLIS1 = docxFile.getInputStream(documentXML);
Document doc = dbf.newDocumentBuilder().parse(documentXMLIS1);
Element docElement = doc.getDocumentElement();
//assertEquals("w:document", docElement.getTagName());
Element bodyElement = (Element) docElement.getElementsByTagName(
"w:body").item(0);
//assertEquals("w:body", bodyElement.getTagName());
Element pElement = (Element) bodyElement.getElementsByTagName("w:p")
.item(0);
//assertEquals("w:p", pElement.getTagName());
Element rElement = (Element) pElement.getElementsByTagName("w:r").item(
0);
//assertEquals("w:r", rElement.getTagName());
Element tElement = (Element) rElement.getElementsByTagName("w:t").item(
0);
//assertEquals("w:t", tElement.getTagName());
//assertEquals("这是第一个测试文档", tElement.getTextContent());
//tElement.setTextContent("这是第一个用Java写的测试文档");
Transformer t = TransformerFactory.newInstance().newTransformer();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
t.transform(new DOMSource(doc), new StreamResult(baos));
ZipOutputStream docxOutFile = new ZipOutputStream(new FileOutputStream(
"response.docx"));
Enumeration<ZipEntry> entriesIter = (Enumeration<ZipEntry>) docxFile
.entries();
while (entriesIter.hasMoreElements()) {
ZipEntry entry = entriesIter.nextElement();
System.out.println(entry.getName());
if (entry.getName().equals("word/document.xml")) {
byte[] data = baos.toByteArray();
docxOutFile.putNextEntry(new ZipEntry(entry.getName()));
byte[] datas = s.getBytes("UTF-8");
docxOutFile.write(datas, 0, datas.length);
//docxOutFile.write(data, 0, data.length);
docxOutFile.closeEntry();
} else if(entry.getName().equals("word/media/image1.png")){
InputStream incoming = new FileInputStream("c:/aaa.jpg");
byte[] data = new byte[incoming.available()];
int readCount = incoming.read(data, 0, data.length);
docxOutFile.putNextEntry(new ZipEntry(entry.getName()));
docxOutFile.write(data, 0, readCount);
docxOutFile.closeEntry();
}else {
InputStream incoming = docxFile.getInputStream(entry);
byte[] data = new byte[incoming.available()];
int readCount = incoming.read(data, 0, data.length);
docxOutFile.putNextEntry(new ZipEntry(entry.getName()));
docxOutFile.write(data, 0, readCount);
docxOutFile.closeEntry();
}
}
docxOutFile.close();
word总是安全模式,每次都要删除模板文件Normal.dot
word总是安全模式的解决方法:
导致这种问题出现,是因为WORD的模板被损坏了,必须把旧的模版清理掉,才可以恢复正常,清理方法,从开始菜单中,先启动“运行”程序。
打开运行窗口后,在里面输入%appdata%\microsoft\templates命令,确定。
进入WORD的模板存放文件夹,即C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates,这个路径会因系统而不同,我这里用的是XP系统。进去后,里面应该有两个文件,如果只看到了一个,另一个则是被系统隐藏起来了。
解除系统隐藏的方法,点击菜单栏中的“工具”,然后从其打开的菜单中选择“文件夹选项”。
在文件夹选项窗口,选择“查看”选项卡,在“高级设置”列表框中,找出红框标志出的几项。
先把“隐藏受保护的操作系统文件(推荐)”这一项的勾去掉,在弹出的警示框中,按“确定”即可。
然后再把“显示系统文件夹的内容”和“显示所有文件和文件夹”都选上,最后按“应用”与“确定”,就设置完成了。
再到WORD存放模板文件夹,隐藏文件就显示出来了,把里面两个模板文件全都删除。
清理损坏的模板后,去试试打开WORD文档,这回就再也没有以安全模式启动的消息提示了,那个WORD模板也会重新生成。
设置WORD文档里的新模板怎么弄啊?
质量佳效率高 用模板做Word文档真是好
使用其它模板改变当前文档样式
文档制作完成后,可以通过“格式”菜单下的“主题”命令,使用“样式库”选择其它模板,一次性替换当前文档的样式组合,让文档以新模板中的样式风格显示。具体操作方法如下:
在当前文档打开的情况下,选择菜单“格式→主题”命令,打开“主题”对话框,单击“样式库”按钮,显示“样式库”对话框,在左侧的“模板”列表框中选择一个模板,比如“典雅型报告”,单击“确定”按钮如图13,返回Word编辑界面,可以看到当前文档的外观按照“典雅型报告”模板的样式风格显示。
小提示:该方法也可以用于已把文档制作完成后,发现先前为文档选择的模板并不适合,需要为文档更换一个模板的情形。
右击建立个性Word文档
进入C:Documents and Settings用户名Templates文件夹,在空白处右击,选择“新建”→“Microsoft Word 文档”新建一个Word文件,命名为winword8.doc。双击winword8.doc,然后对其中的字体、字形、页面大小等作一些个性设置,并保存该文件。
以后在“资源管理器”中右击鼠标,选择“新建”→“Microsoft Word 文档”,再双击新建的文档,就会发现,它已经套用了在winword8.doc中的设置了,从而可以使用自己的个性化Word。
用Word模板批量转换文件
如果经常要一次转换多个文件,可通过Word的模板来完成:
先把要转换的文件放到一个文件夹中,然后启动Word,再选择“文件”→“新建”,并在“新建文件”窗口任务格中选择“通用模板…”,在弹出的“模板”窗口中单击“其它文档”选项卡,双击其中的“转换向导”图标,单击“确定”按钮。此时Word XP会弹出文件转换向导,直接按“下一步”按钮继续。接下来选择转换类型,设置源文件夹和目标文件夹,再选择转换文件,进行转换即可。也可以直接双击 X:Program FilesMicrosoft OfficeTemplates52下的文件“转换向导.Wiz”,如图8:
获得更多模板资源
如果觉得Word中内置的模板不能满足需要,大家可以通过从网上下载更多的模板:
选择“文件”→“新建”,就可以看到“新建文档”任务窗格,注意最下面的“Microsoft.com上的模板”链接。单击后,即可打开该站点上的中文模板库。其中提供了很多类别的模板,非常丰富。只要单击网页上的模板类型链接,就能在网页上看到该类模板的名称和提供商等内容。
单击模板名称,并在“模板最终用户许可协议”窗口中单击“同意”按钮,同时单击“在Microsoft Word中编辑”,IE会将模板下载到硬盘,完成后自动用Word XP打开模板。如果对模板效果满意,再用“另存为”将它保存为模板,就可以像普通模板那样调用了。
小提示:在重新安装系统之前,必须对自定义模板文件夹中的模板文件作一个备份,否则会丢失喔。
坏事的Normal.dot模板
有时点击Word图标,它却没有启动,反而出现一个错误信息。重装都无济于事,严重时,甚至不能卸载和重装Word。一般情况下,这是由于Word的Normal.dot模板文件损坏所造成的,可以通过系统的查找工具找到该文件,然后将其删除,这时Word会自动重建一个新的Normal.dot文件,并恢复正常。
利用模板让Word文件自动备份
默认情况下Word文件是不能自动备份的。不过,可以通过下面的技巧让它具有自动备份功能:启动Word并新建一个空白文件,单击“工具”菜单中的“保存选项”,在“保存”对话框中,选中“保留备份”复选框。同时,勾选“自动保存时间间隔”复选框,再在后面设置一个时间间隔,时间越小,保存越频繁。
完成后,单击“确定”按钮。然后单击“文件”→“另存为”,在“另存为”对话框“保存类型”下拉框中选择“文件模板”,再在“文件名”中输入: ct.dot,然后把它保存到C:Documents and SettingsAdministratorApplication DataMicrosoftTemplates文件夹下(Windows 9x/Me则保存到C:WindowsApplication DataMicrosoftTemplates文件夹中)。
关闭Word,启动“资源管理器”,切换到C:Documents and SettingsAdministratorApplication DataMicrosoftTemplates文件夹下,将Normal.dot删除或者改名,将刚才保存的cfan.dot重命名为 Normal.dot。以后使用Word编辑文件时,每次保存文件,Word都会保存一个副本文件,并以.wbk为扩展名与原文件保存在同一文件夹中。如果哪一次文件发生损坏,就可以选择“文件”→“打开”,在“打开”对话框的“文件类型”中选择“所有文件”,然后找到这个WBK文件,再打开即可
参考资料:www.builder.com.cn
java如何根据word模板生成word文档
先下载jacob_1.10.1.zip。
解压后将jacob.dll放到windows/system32下面或\j2sdk\bin下面。
将jacob.jar加入项目。
/*
* Java2word.java
*
* Created on 2007年8月13日, 上午10:32
*
* To
change this template, choose Tools | Template Manager
* and open the template
in the editor.
*/
/*
* 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。
*
word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,
以免执行错误的替换。
*
所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、
.jpg、.gif)。
*
要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表
word模板中的第N张表格;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代
表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、
第五列的数据,则第一条记录为String[3]
{“1”,”3”,”5”}。
*/
package com.word.util;
/**
*
* @author kdl
*/
import java.util.ArrayList;
import
java.util.HashMap;
import java.util.Iterator;
import com.jacob.activeX.ActiveXComponent;
import
com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class Java2word {
private boolean saveOnExit;
/**
* word文档
*/
Dispatch doc = null;
/**
* word运行程序对象s
*/
private ActiveXComponent
word;
/**
* 所有word文档
*/
private Dispatch
documents;
/**
* 构造函数
*/
public Java2word() {
if(word==null){
word = new
ActiveXComponent("Word.Application");
word.setProperty("Visible",new
Variant(false));
}
if(documents==null)
documents = word.getProperty("Documents").toDispatch();
saveOnExit =
false;
}
/**
* 设置参数:退出时是否保存
* @param
saveOnExit boolean true-退出时保存文件,false-退出时不保存文件
*/
public void
setSaveOnExit(boolean saveOnExit) {
this.saveOnExit =
saveOnExit;
}
/**
* 得到参数:退出时是否保存
* @return
boolean true-退出时保存文件,false-退出时不保存文件
*/
public boolean
getSaveOnExit() {
return saveOnExit;
}
/**
* 打开文件
* @param inputDoc String 要打开的文件,全路径
*
@return Dispatch 打开的文件
*/
public Dispatch open(String inputDoc)
{
return
Dispatch.call(documents,"Open",inputDoc).toDispatch();
//return
Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new
int[1]).toDispatch();
}
/**
* 选定内容
*
@return Dispatch 选定的范围或插入点
*/
public Dispatch select()
{
return word.getProperty("Selection").toDispatch();
}
/**
* 把选定内容或插入点向上移动
* @param selection
Dispatch 要移动的内容
* @param count int 移动的距离
*/
public
void moveUp(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++)
Dispatch.call(selection,"MoveUp");
}
/**
* 把选定内容或插入点向下移动
* @param selection
Dispatch 要移动的内容
* @param count int 移动的距离
*/
public
void moveDown(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++)
Dispatch.call(selection,"MoveDown");
}
/**
* 把选定内容或插入点向左移动
* @param selection
Dispatch 要移动的内容
* @param count int 移动的距离
*/
public
void moveLeft(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++) {
Dispatch.call(selection,"MoveLeft");
}
}
/**
* 把选定内容或插入点向右移动
* @param
selection Dispatch 要移动的内容
* @param count int 移动的距离
*/
public void moveRight(Dispatch selection,int count) {
for(int i =
0;i < count;i ++)
Dispatch.call(selection,"MoveRight");
}
/**
*
把插入点移动到文件首位置
* @param selection Dispatch 插入点
*/
public
void moveStart(Dispatch selection) {
Dispatch.call(selection,"HomeKey",new Variant(6));
}
/**
* 从选定内容或插入点开始查找文本
* @param selection Dispatch
选定内容
* @param toFindText String 要查找的文本
* @return boolean
true-查找到并选中该文本,false-未查找到文本
*/
public boolean find(Dispatch
selection,String toFindText) {
//从selection所在位置开始查询
Dispatch find = word.call(selection,"Find").toDispatch();
//设置要查找的内容
Dispatch.put(find,"Text",toFindText);
//向前查找
Dispatch.put(find,"Forward","True");
//设置格式
Dispatch.put(find,"Format","True");
//大小写匹配
Dispatch.put(find,"MatchCase","True");
//全字匹配
Dispatch.put(find,"MatchWholeWord","True");
//查找并选中
return Dispatch.call(find,"Execute").getBoolean();
}
/**
* 把选定内容替换为设定文本
* @param selection
Dispatch 选定内容
* @param newText String 替换为文本
*/
public
void replace(Dispatch selection,String newText) {
//设置替换文本
Dispatch.put(selection,"Text",newText);
}
/**
* 全局替换
* @param selection Dispatch
选定内容或起始插入点
* @param oldText String 要替换的文本
* @param newText
String 替换为文本
*/
public void replaceAll(Dispatch
selection,String oldText,Object replaceObj) {
//移动到文件开头
moveStart(selection);
if(oldText.startsWith("table") ||
replaceObj instanceof ArrayList)
replaceTable(selection,oldText,(ArrayList) replaceObj);
else
{
String newText = (String) replaceObj;
if(newText==null)
newText="";
if(oldText.indexOf("image") != -1&!newText.trim().equals("") ||
newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 ||
newText.lastIndexOf(".gif") != -1){
while(find(selection,oldText)) {
replaceImage(selection,newText);
Dispatch.call(selection,"MoveRight");
}
}else{
while(find(selection,oldText))
{
replace(selection,newText);
Dispatch.call(selection,"MoveRight");
}
}
}
}
/**
* 替换图片
* @param
selection Dispatch 图片的插入点
* @param imagePath String 图片文件(全路径)
*/
public void replaceImage(Dispatch selection,String imagePath)
{
Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);
}
/**
* 替换表格
* @param selection Dispatch
插入点
* @param tableName String
表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充,N代表word文件中的第N张表
* @param fields HashMap 表格中要替换的字段与数据的对应表
*/
public void
replaceTable(Dispatch selection,String tableName,ArrayList dataList)
{
if(dataList.size() <= 1) {
System.out.println("Empty table!");
return;
}
//要填充的列
String[] cols = (String[])
dataList.get(0);
//表格序号
String tbIndex =
tableName.substring(tableName.lastIndexOf("@") + 1);
//从第几行开始填充
int fromRow =
Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") +
1,tableName.lastIndexOf("@")));
//所有表格
Dispatch tables =
Dispatch.get(doc,"Tables").toDispatch();
//要填充的表格
Dispatch table = Dispatch.call(tables,"Item",new
Variant(tbIndex)).toDispatch();
//表格的所有行
Dispatch rows =
Dispatch.get(table,"Rows").toDispatch();
//填充表格
for(int
i = 1;i < dataList.size();i ++) {
//某一行数据
String[] datas = (String[]) dataList.get(i);
//在表格中添加一行
if(Dispatch.get(rows,"Count").getInt() < fromRow +
i - 1)
Dispatch.call(rows,"Add");
//填充该行的相关列
for(int j = 0;j < datas.length;j ++)
{
//得到单元格
Dispatch cell =
Dispatch.call(table,"Cell",Integer.toString(fromRow + i -
1),cols[j]).toDispatch();
//选中单元格
Dispatch.call(cell,"Select");
//设置格式
Dispatch font = Dispatch.get(selection,"Font").toDispatch();
Dispatch.put(font,"Bold","0");
Dispatch.put(font,"Italic","0");
//输入数据
Dispatch.put(selection,"Text",datas[j]);
}
}
}
/**
* 保存文件
* @param outputPath String
输出文件(包含路径)
*/
public void save(String outputPath) {
Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);
}
/**
* 关闭文件
* @param document Dispatch
要关闭的文件
*/
public void close(Dispatch doc) {
Dispatch.call(doc,"Close",new Variant(saveOnExit));
word.invoke("Quit",new Variant[]{});
word = null;
}
/**
* 根据模板、数据生成word文件
* @param inputPath
String 模板文件(包含路径)
* @param outPath String 输出文件(包含路径)
* @param
data HashMap 数据包(包含要填充的字段、对应的数据)
*/
public void toWord(String
inputPath,String outPath,HashMap data) {
String oldText;
Object newValue;
try {
if(doc==null)
doc = open(inputPath);
Dispatch selection =
select();
Iterator keys =
data.keySet().iterator();
while(keys.hasNext())
{
oldText = (String) keys.next();
newValue = data.get(oldText);
replaceAll(selection,oldText,newValue);
}
save(outPath);
} catch(Exception
e) {
System.out.println("操作word文件失败!");
e.printStackTrace();
} finally {
if(doc !=
null)
close(doc);
}
}
如何C#操作word模板生成word文档并打开?
codeproject上有很多操作word的C#代码:
顺便给你几个链接:
http://www.codeproject.com/KB/office/Word_Automation.aspx
http://www.codeproject.com/KB/office/Word2007Automation.aspx
http://www.codeproject.com/KB/office/csautomateword.aspx
private void met_word_automation()
{
try
{
// Declaring the object variables we will need later
object varFileName = "c:\\temp\\doc.docx";
object varFalseValue = false;
object varTrueValue = true;
object varMissing = Type.Missing;
string varText;
// Create a reference to Microsoft Word application
Microsoft.Office.Interop.Word.Application varWord =
new Microsoft.Office.Interop.Word.Application();
// Creates a reference to a Word document
Microsoft.Office.Interop.Word.Document varDoc =
varWord.Documents.Open(ref varFileName, ref varMissing,
ref varFalseValue,
ref varMissing, ref varMissing, ref varMissing, ref varMissing,
ref varMissing, ref varMissing, ref varMissing,
ref varMissing, ref varMissing, ref varMissing, ref varMissing,
ref varMissing, ref varMissing);
// Activate the document
varDoc.Activate();
// Change the 1st sentence of the document
varText = "Altered sentence nr. 1";
varDoc.Sentences[0].Text = varText;
// Change the 3rd sentence of the document
varText = "Altered sentence nr. 3";
varDoc.Sentences[2].Text = varText;
// Save the document
varDoc.Save();
// Show the Microsoft Word window with our document on it
varWord.Visible = true;
// Call the print dialog in Word
Microsoft.Office.Interop.Word.Dialog varDlg =
varWord.Application.Dialogs[
Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFilePrint];
varDlg.Show(ref varMissing);
// Print the document
varDoc.PrintOut(ref varTrueValue, ref varFalseValue, ref varMissing,
ref varMissing, ref varMissing, ref varMissing,
ref varMissing, ref varMissing, ref varMissing, ref varMissing,
ref varFalseValue, ref varMissing, ref varMissing,
ref varMissing, ref varMissing, ref varMissing, ref varMissing,
ref varMissing);
// Send mail with this document as an attachment
varDoc.SendMail();
}
catch (Exception varE)
{
MessageBox.Show("Error:\
" + varE.Message, "Error message");
}
}
You need to create references to this .NET namespace in order to use the above code:
Microsoft.Office.Interop.Word
Word:可以用一个Word文档为模板将样式套用到另一个文档中?
office2003:
1、将模板文件另存为以dot为扩展名的文件。
2、打开待套用模板的word文档,点击“工具”-“模板和加载项”,在弹出的对话框中,“文档模板”项下,“选用”按钮,找到刚才另存的dot文件,并勾选“自动更新文档样式”。
office2007:
方法1、点击样式格右下方的箭头,会弹出样式窗格,再点击最下方的“管理样式”,然后点击左下方的“导入/导出”,在右方装载论文模板复制样式即可。这里的模板文件可以是dot也可以是2007版特有的dotx文件。
方法2、打开word文档,点击开发工具下的“文档模板”,打开“模板和加载项”对话框
点击对话框底部的“管理器”按钮,同样可以进行模板的套用操作。接下来的操作同方法1。
Access字段中的数据怎么直接生成到Word文档的合同模板中?
可以使用邮件合并,选择Access文件作为数据源,再将数据合并到模板中。将模板设置好后,合并过程自动完成,哪怕你的数据有成千上万条,也能迅速完成。
Word文档模板文件的扩展名是 A) TXT B) DOC C) WPS D) DOT
选择D),A表示是文本文件格式,B是指WORD编辑的文件,C是WPS编辑的文件,D指WORD模板文件,其实你随便在WORD里新建一个文件,然后选择另存为模板就知道了。
转载请注明出处51数据库 » c根据模板生成word文档 poi根据模板导出word