由于我不擅长言辞与华丽的文采,就在这里直接贴出相应的代码,其中导入和导出都看个人而异。大致对word的操作都可以网上搜到。
1.JAVA版
JAVA版我主要用的是JACOB。版本是jacob-1.14.3-x86,可以网上下到。由于代码太多,我就不一一贴出
代码
ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法
/**
完成初始化工作
*/
ActiveXComponent objWord = new ActiveXComponent("Word.Application");// Instantiate objWord and Declare word object
Dispatch wordObject = (Dispatch) objWord.getObject();// Assign a local word object
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// Variant(true)表示word应用程序可见
Dispatch documents = objWord.getProperty("Documents").toDispatch(); // documents表示word的所有文档窗口,(word是多文档应用程序)
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档
Dispatch ActiveWindow = objWord.getProperty("ActiveWindow")
.toDispatch();
Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane")
.toDispatch();
/**
*开始写word的工作,包括标题,正文(段落一、段落二)
*/
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Dispatch selection = Dispatch.get(wordObject, "Selection").toDispatch();
Dispatch paragraphFormat=Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch paragraphFormat1=
Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch.put(paragraphFormat1, "Alignment", "1"); // 设置标题的对齐方式(1:置中 2:靠右 3:靠左)
Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象
Dispatch.put(font, "Bold", "1"); // 字型租体
Dispatch.put(font, "Size", "15"); //字体大小
Dispatch.call(selection, "TypeText", "人员简历(编号:"+personalbaseinfo.getPersonno()+")"); // 写入标题内容
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(font, "Size", "10");
Dispatch tables = Dispatch.get(wordContent, "Tables").toDispatch(); //所有的表格数
String realPath = request.getRealPath("/").replace("\\.\\","\\").replace("/","\\\\\\\\");
//写页眉和页脚
Dispatch View = Dispatch.get(ActivePane, "View").toDispatch();
Dispatch.put(View, "SeekView", "9"); //9是设置页眉
Dispatch.put(paragraphFormat1, "Alignment", "3"); // 置中
String url="theme/default/images/gxa.jpg";
Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
"AddPicture", realPath+url);
Dispatch.put(View, "SeekView", "10"); // 10是设置页脚
Dispatch.put(paragraphFormat1, "Alignment", "2"); // 靠右
Dispatch.put(selection, "Text", "***********内容*****"); // 初始化从1开始
Dispatch.call(selection, "EndKey",6);
String path=realPath+"uploadfile\\tempfile";
File file =new File(path);
boolean flag = false;
if(!file.exists()){
flag = file.mkdir();
}else{
delFolder(path);
flag = file.mkdir();
flag=true;
}
Date now = new Date();
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");
String name = sdf2.format(now)+".doc";
/**
* 关闭文档
*/
Dispatch.call(document, "SaveAs", new Variant(path+"\\"+name)); // 保存一个新文档
Dispatch.call(objWord,"Quit",new Variant(true)); //关闭对象
ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
try {
if(flag){
this.onLoad();
response.sendRedirect("uploadfile/tempfile/"+name);
facesContext.responseComplete();
}
} catch (IOException e) {
}
return (path+"\\test.doc");
}
/**
完成初始化工作
*/
ActiveXComponent objWord = new ActiveXComponent("Word.Application");// Instantiate objWord and Declare word object
Dispatch wordObject = (Dispatch) objWord.getObject();// Assign a local word object
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// Variant(true)表示word应用程序可见
Dispatch documents = objWord.getProperty("Documents").toDispatch(); // documents表示word的所有文档窗口,(word是多文档应用程序)
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档
Dispatch ActiveWindow = objWord.getProperty("ActiveWindow")
.toDispatch();
Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane")
.toDispatch();
/**
*开始写word的工作,包括标题,正文(段落一、段落二)
*/
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Dispatch selection = Dispatch.get(wordObject, "Selection").toDispatch();
Dispatch paragraphFormat=Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch paragraphFormat1=
Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch.put(paragraphFormat1, "Alignment", "1"); // 设置标题的对齐方式(1:置中 2:靠右 3:靠左)
Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象
Dispatch.put(font, "Bold", "1"); // 字型租体
Dispatch.put(font, "Size", "15"); //字体大小
Dispatch.call(selection, "TypeText", "人员简历(编号:"+personalbaseinfo.getPersonno()+")"); // 写入标题内容
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(font, "Size", "10");
Dispatch tables = Dispatch.get(wordContent, "Tables").toDispatch(); //所有的表格数
String realPath = request.getRealPath("/").replace("\\.\\","\\").replace("/","\\\\\\\\");
//写页眉和页脚
Dispatch View = Dispatch.get(ActivePane, "View").toDispatch();
Dispatch.put(View, "SeekView", "9"); //9是设置页眉
Dispatch.put(paragraphFormat1, "Alignment", "3"); // 置中
String url="theme/default/images/gxa.jpg";
Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
"AddPicture", realPath+url);
Dispatch.put(View, "SeekView", "10"); // 10是设置页脚
Dispatch.put(paragraphFormat1, "Alignment", "2"); // 靠右
Dispatch.put(selection, "Text", "***********内容*****"); // 初始化从1开始
Dispatch.call(selection, "EndKey",6);
String path=realPath+"uploadfile\\tempfile";
File file =new File(path);
boolean flag = false;
if(!file.exists()){
flag = file.mkdir();
}else{
delFolder(path);
flag = file.mkdir();
flag=true;
}
Date now = new Date();
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");
String name = sdf2.format(now)+".doc";
/**
* 关闭文档
*/
Dispatch.call(document, "SaveAs", new Variant(path+"\\"+name)); // 保存一个新文档
Dispatch.call(objWord,"Quit",new Variant(true)); //关闭对象
ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
try {
if(flag){
this.onLoad();
response.sendRedirect("uploadfile/tempfile/"+name);
facesContext.responseComplete();
}
} catch (IOException e) {
}
return (path+"\\test.doc");
}
2.c#版
下面是一个用dot模板替换的列子,可解决替换过程中字符串过长,我想到的就是用递归来,哈哈。
代码
object _NullObject = System.Reflection.Missing.Value;
object _ReadOnly = true;
ApplicationClass _Application = null;
Document _DocumentClass = null;
protected void Page_Load(object sender, EventArgs e)
{
//Import();
}
/// <summary>
/// 创建红头批示
/// </summary>
/// <param name="year"></param>
/// <param name="issuce"></param>
/// <param name="date"></param>
/// <param name="cgdw"></param>
/// <param name="publication"></param>
/// <param name="content"></param>
/// <param name="editor"></param>
/// <param name="sender"></param>
private void CreateComment(string year,
string issuce,
string date,
string cgdw,
string publication,
string content,
string editor,
string sender)
{
object _Path = HttpContext.Current.Server.MapPath("红头批示.dot");
try
{
_Application = new ApplicationClass();
_DocumentClass = _Application.Documents.Add(ref _Path, ref _NullObject, ref _NullObject, ref _NullObject);
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
Replace("[model:year]", year);
Replace("[model:issuce]", issuce);
Replace("[model:date]", date);
Replace("[model:cgdw]", cgdw);
Replace("[model:publication]", publication);
Replace("[model:content]", content);
Replace("[model:editor]", editor);
Replace("[model:sender]", sender);
//_Application.Selection.Find.Execute(ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
//ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
//ref replaceAll, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject);
object _Start = 2;
object _End = 2;
//if (_Application.Selection.Find.Execute(ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
// ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
// ref replaceAll, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject))
//{
//}
object _Tp = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "\\红头批示");
object _FormateDate = WdSaveFormat.wdFormatDocument97;
_DocumentClass.SaveAs(ref _Tp, ref _FormateDate, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
finally
{
if (_DocumentClass != null)
{
try
{
_DocumentClass.Close(ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
}
if (_Application != null)
{
try
{
_Application.Quit(ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(_Application);
System.Runtime.InteropServices.Marshal.ReleaseComObject(_DocumentClass);
_Application = null;
_DocumentClass = null;
GC.Collect();
}
}
///﹤summary﹥
/// 浅析C#Word文档替换操作,在word 中查找一个字符串直接替换所需要的文本
/// ﹤/summary﹥
/// ﹤param name="strOldText"﹥原文本﹤/param﹥
/// ﹤param name="strNewText"﹥新文本﹤/param﹥
/// ﹤returns﹥﹤/returns﹥
public void Replace(string strOldText, string strNewText)
{
_DocumentClass.Content.Find.Text = strOldText;
object FindText, ReplaceWith, ReplaceType;
object MissingValue = Type.Missing;
FindText = strOldText;//要查找的文本
ReplaceWith = strNewText;//替换文本
//判断字符串内容是否过长,如果过长则自动切断
if (strNewText.Length > 220)
{
ReplaceWith = strNewText.Substring(0, 220) + strOldText;
}
ReplaceType = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
/***
* wdReplaceAll - 替换找到的所有项。
* wdReplaceNone - 不替换找到的任何项。
* wdReplaceOne - 替换找到的第一项。
***/
_DocumentClass.Content.Find.ClearFormatting(); //移除Find的搜索文本和段落格式设置
if (_DocumentClass.Content.Find.Execute(ref FindText, ref MissingValue, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue, ref ReplaceWith,
ref ReplaceType, ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue))
{
if (strNewText.Length > 220)
{
Replace(FindText.ToString(), strNewText.Substring(221, strNewText.Length-221));
}
}
}
object _ReadOnly = true;
ApplicationClass _Application = null;
Document _DocumentClass = null;
protected void Page_Load(object sender, EventArgs e)
{
//Import();
}
/// <summary>
/// 创建红头批示
/// </summary>
/// <param name="year"></param>
/// <param name="issuce"></param>
/// <param name="date"></param>
/// <param name="cgdw"></param>
/// <param name="publication"></param>
/// <param name="content"></param>
/// <param name="editor"></param>
/// <param name="sender"></param>
private void CreateComment(string year,
string issuce,
string date,
string cgdw,
string publication,
string content,
string editor,
string sender)
{
object _Path = HttpContext.Current.Server.MapPath("红头批示.dot");
try
{
_Application = new ApplicationClass();
_DocumentClass = _Application.Documents.Add(ref _Path, ref _NullObject, ref _NullObject, ref _NullObject);
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
Replace("[model:year]", year);
Replace("[model:issuce]", issuce);
Replace("[model:date]", date);
Replace("[model:cgdw]", cgdw);
Replace("[model:publication]", publication);
Replace("[model:content]", content);
Replace("[model:editor]", editor);
Replace("[model:sender]", sender);
//_Application.Selection.Find.Execute(ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
//ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
//ref replaceAll, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject);
object _Start = 2;
object _End = 2;
//if (_Application.Selection.Find.Execute(ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
// ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject,
// ref replaceAll, ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject))
//{
//}
object _Tp = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "\\红头批示");
object _FormateDate = WdSaveFormat.wdFormatDocument97;
_DocumentClass.SaveAs(ref _Tp, ref _FormateDate, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject,
ref _NullObject, ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
finally
{
if (_DocumentClass != null)
{
try
{
_DocumentClass.Close(ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
}
if (_Application != null)
{
try
{
_Application.Quit(ref _NullObject, ref _NullObject, ref _NullObject);
}
catch
{
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(_Application);
System.Runtime.InteropServices.Marshal.ReleaseComObject(_DocumentClass);
_Application = null;
_DocumentClass = null;
GC.Collect();
}
}
///﹤summary﹥
/// 浅析C#Word文档替换操作,在word 中查找一个字符串直接替换所需要的文本
/// ﹤/summary﹥
/// ﹤param name="strOldText"﹥原文本﹤/param﹥
/// ﹤param name="strNewText"﹥新文本﹤/param﹥
/// ﹤returns﹥﹤/returns﹥
public void Replace(string strOldText, string strNewText)
{
_DocumentClass.Content.Find.Text = strOldText;
object FindText, ReplaceWith, ReplaceType;
object MissingValue = Type.Missing;
FindText = strOldText;//要查找的文本
ReplaceWith = strNewText;//替换文本
//判断字符串内容是否过长,如果过长则自动切断
if (strNewText.Length > 220)
{
ReplaceWith = strNewText.Substring(0, 220) + strOldText;
}
ReplaceType = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
/***
* wdReplaceAll - 替换找到的所有项。
* wdReplaceNone - 不替换找到的任何项。
* wdReplaceOne - 替换找到的第一项。
***/
_DocumentClass.Content.Find.ClearFormatting(); //移除Find的搜索文本和段落格式设置
if (_DocumentClass.Content.Find.Execute(ref FindText, ref MissingValue, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue, ref ReplaceWith,
ref ReplaceType, ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue))
{
if (strNewText.Length > 220)
{
Replace(FindText.ToString(), strNewText.Substring(221, strNewText.Length-221));
}
}
}
最后心情比较复杂,因为有个可爱的小笨蛋。有需要的可以向我要源码,网速太慢就不上传了。