由于我不擅长言辞与华丽的文采,就在这里直接贴出相应的代码,其中导入和导出都看个人而异。大致对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 ));
}
}
}
最后心情比较复杂,因为有个可爱的小笨蛋。有需要的可以向我要源码,网速太慢就不上传了。