如何实现Word中的替换功能

Magichi 2009-02-26 06:27:15
想要的效果:
今天做了个richtextbox,里面写入一点参数
如:[学生][教师][校长]
存储在数据库里面
但实际的值提取出来后,要按这个模板来
如:
表1:
学生:michael,教师:jack,校长:son
richtextbox中就应该显示:
[michael][jack][son]




现在说下我做的吧:
我现在是将richtextbox中的内容以rtf格式存储在数据库中,提取出来也是rtf,后来想过用richtextbox.formate(),但只能改变text,其中的其他信息没办法保留,包括强制选中某段文字。
后来只能想用借用word这个工具了,但也只能实现查找替换,替换完后文字格式也没办法保存,不知道哪位神仙能帮我解决下?
...全文
931 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magichi 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bluest 的回复:]
这是我自己做的,你只要改为变量不就OK了.我正在应用这个程序.
[/Quote]
问题是我不知道怎么提取bold和color,请问有方法提取原先文本中某段文字的这两个属性吗?
hbmy9107lwt 2009-02-27
  • 打赏
  • 举报
回复
ding
bluest 2009-02-27
  • 打赏
  • 举报
回复
这是我自己做的,你只要改为变量不就OK了.我正在应用这个程序.
Magichi 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bluest 的回复:]
private void button1_Click(object sender, System.EventArgs e)
{
object m_file_id=@"D:\2.doc"; //要打开的文档路径
object missing=Type.Missing;

Word.Application word=new Word.ApplicationClass();
Word.Document doc=word.Documents.Open(
ref m_file_id,ref missing, ref missing,ref missing, ref missing,
ref missing, ref missing,ref missing, ref missing,ref missing,
ref missing,ref miss…
[/Quote]
哪里抄来的?你看清我的问题了吗?你在里面写死了bold和color,问题是如何根据原先的bold和color来替换
bluest 2009-02-27
  • 打赏
  • 举报
回复
using Word=Microsoft.Office.Interop.Word;
//这个也要加上
bluest 2009-02-27
  • 打赏
  • 举报
回复
private void button1_Click(object sender, System.EventArgs e)
{
object m_file_id=@"D:\2.doc"; //要打开的文档路径
object missing=Type.Missing;

Word.Application word=new Word.ApplicationClass();
Word.Document doc=word.Documents.Open(
ref m_file_id,ref missing, ref missing,ref missing, ref missing,
ref missing, ref missing,ref missing, ref missing,ref missing,
ref missing,ref missing,ref missing,ref missing, ref missing,
ref missing);

string m_find_key="";
string m_context="";

m_find_key="varTitle";
m_context="This is the title!";
FindDocument(doc,m_find_key,"STRING",m_context) ;

m_find_key="varImage";
m_context=@"D:\logo2.gif";
FindDocument(doc,m_find_key,"IMAGE",m_context);

doc.Close(ref missing,ref missing,ref missing);
word.Quit(ref missing,ref missing,ref missing);
}

public void FindDocument( Word.Document doc,string find_text,string title,string context)
{
object missing=Type.Missing;
object start = 0;
object end = doc.Characters.Count;

Word.Range range = doc.Range( ref start, ref end );
Word.Find find = range.Find;

find.ClearFormatting();
find.Forward = true;
find.Text = find_text;

string m_title=title.ToUpper();
string m_find_text=find_text.ToUpper();

ExecuteFind( find );
while ( find.Found )
{
switch(m_title)
{
case "STRING":
range.Text=context;
range.Font.Color = Word.WdColor.wdColorRed;
range.Font.Bold = 600;
break;

case "IMAGE":
range.Text="";
range.InlineShapes.AddPicture(context,ref missing,ref missing,ref missing);
break;
}
ExecuteFind( find );
}
}

public Boolean ExecuteFind( Word.Find find )
{
return ExecuteFind( find, find.Text, Type.Missing, Type.Missing );
}

public Boolean ExecuteFind(
Word.Find find, string strFindText, Object wrapFind, Object forwardFind )
{
// Simple wrapper around Find.Execute:

Object findText ;
Object matchCase = Type.Missing;
Object matchWholeWord = Type.Missing;
Object matchWildcards = Type.Missing;
Object matchSoundsLike = Type.Missing;
Object matchAllWordForms = Type.Missing;
Object forward = forwardFind;
Object wrap = wrapFind;
Object format = Type.Missing;
Object replaceWith = Type.Missing;
Object replace = Type.Missing;
Object matchKashida = Type.Missing;
Object matchDiacritics = Type.Missing;
Object matchAlefHamza = Type.Missing;
Object matchControl = Type.Missing;

if ( ( strFindText == "" )||( strFindText == string.Empty ) )
findText = find.Text;
else
findText = strFindText;
find.ClearFormatting();
return find.Execute( ref findText, ref matchCase, ref matchWholeWord,
ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms,
ref forward, ref wrap, ref format, ref replaceWith, ref replace,
ref matchKashida, ref matchDiacritics, ref matchAlefHamza,
ref matchControl );
}

//别忘记了加分给我
wts_net 2009-02-27
  • 打赏
  • 举报
回复
另外你要保留格式的话 你就要做有格式的模板,这样你替换后的数据还是有格式的
wts_net 2009-02-27
  • 打赏
  • 举报
回复
用书签吧
#region 用于处理没有表格的循环
/// <summary>
/// 设置普通书签的文本(用于处理没有表格的循环LOOP)
/// </summary>
/// <param name="bookmark"></param>
public static void SetTextBookmarkValue(Bookmark bookmark, DataTable tbvalue)
{
//1.解析书签文本
//2.查找书签的配置
//3.使用配置到相应的数据中找到数据,替换书签文本
//处理当数据为空时添加一空行,清理模板中的配置字符串(tw 2009-2-24)
if (tbvalue.Rows.Count <= 0)
AddRowToDt(ref tbvalue, 1);
StringBuilder tempmainstr = new StringBuilder();
string[] marktext = new string[2];//用来保存要替换模板的原始数据
marktext[0] = bookmark.Range.Text;
marktext[1] = marktext[0];
foreach (DataRow dr in tbvalue.Rows)
{
drmar = dr;
//执行替换操作
marktext[1] = Regex.Replace(marktext[1], regextstr, new MatchEvaluator(ReplaceModel), RegexOptions.IgnoreCase | RegexOptions.Compiled);
marktext[1] = Regex.Replace(marktext[1], "\\r\\a", "", RegexOptions.Compiled);
tempmainstr.AppendLine(marktext[1]);//换行
marktext[1] = marktext[0];//恢复模板的原始数据
}
bookmark.Range.Text = tempmainstr.ToString();

}
#endregion

#region 用于处理带表格的循环
/// <summary>
/// 设置循环和嵌套的书签(可自动创建行与列TABLE)(用于)printnew2.doc
/// </summary>
/// <param name="bookmark"></param>
public static void SetLoopTextBookmark(Bookmark bookmark, DataTable tbvalue)
{
//处理当数据为空时添加一空行,清理模板中的配置字符串(tw 2009-2-24)
if (tbvalue.Rows.Count <= 0)
AddRowToDt(ref tbvalue, 1);
object Count = 1;
object Unit = WdUnits.wdRow;
Table maintb = bookmark.Range.Tables[1];
int start = bookmark.Range.Rows[1].Index;
int j = 1;
AutoAddRow(ref start, maintb, bookmark, tbvalue.Rows.Count, true);
foreach (DataRow darow in tbvalue.Rows)
{
drmar = darow;
rowid = j++;
Row newrow = maintb.Range.Rows[start];
start++;
int i = 1;
string tempcle = "";
foreach (Cell cel in newrow.Range.Cells)
{
tempcle = bookmark.Range.Rows[1].Range.Cells[i].Range.Text;
tempcle = Regex.Replace(tempcle, regextstr, new MatchEvaluator(ReplaceModel), RegexOptions.IgnoreCase | RegexOptions.Compiled);
tempcle = Regex.Replace(tempcle, "\\r\\a", "", RegexOptions.Compiled);
cel.Range.Text = tempcle;
i++;
}
}
//清理书签
bookmark.Range.Rows[1].Delete();
}

/// <summary>
/// 自动创建行
/// </summary>
/// <param name="rowindex">书签所在行的row index</param>
/// <param name="mailtb">书签所在的表格</param>
/// <param name="bookmark">书签</param>
/// <param name="Count">数据源的行数</param>
/// <param name="isadd">是否创建行</param>
private static void AutoAddRow(ref int rowindex,Table mailtb,Bookmark bookmark,int Count,bool isadd)
{
if (!isadd)
return;
int state=0;//用于区分表格的样式(0为书签的Next与书签格式不同,1为书签的Next与书签格式一致,2书签的Next为空)
int copyrowindex = rowindex;
Row row = mailtb.Rows[rowindex];
object modelrow = row;
for (int i = 0; i < Count; i++)
{
Row newrow = mailtb.Rows[copyrowindex].Next;
copyrowindex++;
int celcount = row.Cells.Count;
if (newrow == null)
{
state = 2;
mailtb.Rows.Add(ref missing);
}
else
{
if (newrow.Cells.Count != celcount)
{
if (state == 1)
{
bookmark.Range.Rows.Add(ref missing);
}
else
{
newrow.Range.Rows.Add(ref modelrow);
}
}
else
{
state = 1;
}
}

}
//新增的行第一行的index
if (state != 0)
rowindex++;
}

#endregion
我有适全2000和2003的封好的类,我前几天写的,如果需要msn我吧
wtszlh_20@hotmail.com
写出两个方法希望能帮到你
zhoujk 2009-02-26
  • 打赏
  • 举报
回复
试过XML没?其实WORD的格式描述原理也和XML很类似,所以可以自己写成WORD的格式
du9232 2009-02-26
  • 打赏
  • 举报
回复
用替换书签的方法
supremeholy 2009-02-26
  • 打赏
  • 举报
回复
友情up!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧