c# word操作篇,解决字符串长度超过255就不能替换的问题
本文使用的是Microsoft.Office.Interop.Word组件,必须在系统安装了office相关组件的条件下进行,在com里面找到Microsoft Word 16.0 Object Library并引用。
问题:使用c#操作word替换占位符的时候,当要替换的字符串超过一定的长度,就会提示“字符串参量过长”,搜索发现,替换的最大长度为255字符。
以220个字符串为例,执行替换工作。
//构造数据
Dictionary<string, string> datas = new Dictionary<string, string>() { { "{name}", "张三" }, { "{sex}", "男" }, { "{provinve}", "浙江" } };
//模板文件
object path = Server.MapPath("/Template/template.docx");
//生成文件
string physicNewFile = Server.MapPath("/createdfile/" + Guid.NewGuid().ToString() + ".docx");
/// <summary>
/// 根据模板生成替换文件并下载
/// </summary>
/// <param name="path">文件/模板地址</param>
/// <param name="datas">需要替换的key:value集合</param>
/// <param name="physicNewFile">生成文件地址</param>
public void ReplaceToWord(object path, Dictionary<string, string> datas, string physicNewFile)
{
Microsoft.Office.Interop.Word.Application app = null;
Microsoft.Office.Interop.Word._Document doc = null;
object oMissing = System.Reflection.Missing.Value;
try
{
app = new Microsoft.Office.Interop.Word.Application();
object fileName = path;
//打开模板文件
doc = app.Documents.Open(ref fileName,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; foreach (var item in datas)
{
app.Selection.Find.Replacement.ClearFormatting();
app.Selection.Find.ClearFormatting();
if (item.Value.Length > 220)
FindAndReplaceLong(app, item.Key, item.Value);
else
FindAndReplace(app, item.Key, item.Value);
} //对替换好的word模板另存为一个新的word文档
doc.SaveAs(physicNewFile,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing); //准备导出word
Response.Clear();
Response.Buffer = true;
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmssss") + ".doc");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.ContentType = "application/ms-word";
Response.End();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (doc != null)
{
//关闭word文档
doc.Close(ref oMissing, ref oMissing, ref oMissing);
doc = null;
}
if (app != null)
{
//退出word应用程序
app.Quit(ref oMissing, ref oMissing, ref oMissing);
app = null;
}
//GC.Collect();
//GC.WaitForPendingFinalizers();
//GC.Collect();
//GC.WaitForPendingFinalizers();
//如果文件存在则输出到客户端
if (System.IO.File.Exists(physicNewFile))
{
Response.WriteFile(physicNewFile);
}
}
}
/// <summary>
/// 根据字符串长度执行替换操作
/// </summary>
/// <param name="wordApp">当前word程序</param>
/// <param name="findText">占位符(key)</param>
/// <param name="replaceText">替换字符串(值)</param>
public void FindAndReplaceLong(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText)
{
int len = replaceText.ToString().Length; //要替换的文字长度
int cnt = len / 220; //不超过220个字
string newstr;
object newStrs;
if (len < 220) //小于220字直接替换
{
FindAndReplace(wordApp, findText, replaceText);
}
else
{
for (int i = 0; i <= cnt; i++)
{
if (i != cnt)
newstr = replaceText.ToString().Substring(i * 220, 220) + findText; //新的替换字符串
else
newstr = replaceText.ToString().Substring(i * 220, len - i * 220); //最后一段需要替换的文字
newStrs = newstr;
FindAndReplace(wordApp, findText, newStrs); //进行替换
}
}
}
/// <summary>
/// 执行替换操作
/// </summary>
/// <param name="wordApp">当前word程序</param>
/// <param name="findText">占位符(key)</param>
/// <param name="replaceText">替换字符串(值)</param>
public void FindAndReplace(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText)
{
//object oMissing = System.Reflection.Missing.Value;
object matchCase = true;
object matchWholeWord = true;
object matchWildCards = false;
object matchSoundsLike = false;
object matchAllWordForms = false;
object forward = true;
object format = false;
object matchKashida = false;
object matchDiacritics = false;
object matchAlefHamza = false;
object matchControl = false;
object read_only = false;
object visible = true;
object replace = 2; //object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
object wrap = 1;
wordApp.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceText,
ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
// wordApp.Selection.Find.Execute( ref oMissing, ref oMissing,ref oMissing, ref oMissing,ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref replace,
//ref oMissing, ref oMissing,ref oMissing, ref oMissing);
}
Asp.Net操作Word内容
如果要正常操作Word Com组件的话,必须要给用户赋上足够的权限的,
1、运行Dcomcnfg.exe
2、组件服务――计算机――我的电脑――DCOM配置――找到microsoft word 文档
3、点击属性
4、选择“安全性”
5、选定“使用自定义访问权限”和“使用自定义启动权限”
6、分别编辑权限,添加ASPNET,VS Developers,Debugger User //不一定
7、选择“身份标识”,在选定“交互式用户” 即可 (关键步骤)必须
8、在Web.config里加 <identity impersonate="true"/>
参考链接:http://www.cnblogs.com/riddly/p/9231719.html
c# word操作篇,解决字符串长度超过255就不能替换的问题的更多相关文章
- EXCEL某列长度超过255个字符导入SQL SERVER的处理方法
问题描述: [Excel 源 [1]] 错误: 输出“Excel 源输出”(9) 上的 输出列“Description 3”(546) 出错.返回的列状态是:“文本被截断,或者一个或多个字符在目标代码 ...
- C#中用OLEDB操作EXCEL时,单元格内容长度超过255被截断
C#中Microsoft.ACE.OLEDB.12.0 驱动读取excel,会读取前8行来判定每列的数据类型,假如没有超过255个字符,那么会被设置为nvarchar(255),从第9行开始,超过25 ...
- 用OLEDB读取EXCEL时,单元格内容长度超过255被截断
https://support.microsoft.com/zh-cn/help/189897/data-truncated-to-255-characters-with-excel-odbc-dri ...
- EXCEL某列长度超过255个字符导入SQL SERVER2005的处理方法
将注册表中 Jet引擎. HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel 如果是:ACE引擎. HKEY_LOCAL_MACHI ...
- angularjs如何在ng-repeat过程中控制字符串长度超过指定长度后面内容以省略号显示
angular.module('ng').filter('cut', function () { return function (value, wordwise, max, tail) { if ( ...
- C#导出Excel,某单元格内容长度超过255 的解决方法
public static void ToExcel(DataTable dtSource, string strPath, string strSheetName) { System.Data.Ol ...
- ora 32021 设置参数时参数值长度超过255处理办法
alter system set db_file_name_convert='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-.' scope=spfi ...
- .NET MVC JSON JavaScriptSerializer 字符串的长度超过 maxJsonLength 值问题的解决
[ArgumentException: 使用 JSON JavaScriptSerializer 序列化或还原序列化期间发生错误.字符串的长度超过在 maxJsonLength 属性上设定的值. 参数 ...
- ASP.NET MVC Json()处理大数据异常解决方法,字符串的长度超过了为 maxJsonLength
问题: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. <system.web.exten ...
随机推荐
- [Codeforces613E]Puzzle Lover
Problem 给你2*n的格子,每个格子有一个字母,从任意一点出发,不重复的经过上下左右,生成要求的字符串.问有几种不同的走法. Solution 分三段,左U型.中间.右U型. 分别枚举左边和右边 ...
- python中字符串方法总结
定义一个空字符串: a=' '; s.strip() #去空格 s.upper()#全部转换成大写: s.lower()# 全部转换成小写: s.isdigit()#判断字符串是否只有数字组成:返回t ...
- 海量数据处理之top K问题
题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...
- git 操作规范
分支描述 长期存在 online 主分支,负责记录上线版本的迭代,该分支代码与线上代码是完全一致的. dev 开发分支,该分支记录相对稳定的版本,所有的feature分支都从该分支创建. 多套开发环境 ...
- LeetCode 46 全排列
题目: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3 ...
- 微信小程序des加密、PHP des解密
最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...
- Javascript中的this指向。
一.JavaScript中的函数 在了解this指向之前,要先弄明白函数执行时它的执行环境是如何创建的,这样可以更清楚的去理解JavaScript中的this指向. function fn(x,y,n ...
- lettuce行为驱动框架实例
练习: 一:e1_MyFirstBDD 使用方法的方式实现阶乘的计算 zero.feature: Feature: Compute factorial In order to play with Le ...
- FOR XML PATH 简单介绍
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- matlab学习(3) 保存和导入工作区
1.保存和导入工作区变量mat文件 假如创建了两个矩阵A=[1,2;3,4],B=[0,1;1,0] 则工作区就是这样的: 当函数有一个数据量非常大的返回值时,每次调用函数都要执行一遍函数,每次都要等 ...