我在vs用c#写窗体程序用来做表格读取和word生成,用了NPOI和interop.word两个程序包,之前写了两个功能都能正常使用,包括了读取excel数据、生成word文字、合并多个word的过程。
今天编写新功能的时候引用了很多之前的代码,也进行了参数更改,原有函数可以完美运行,新增了一个插入图片的函数,也能正常使用。
但是文档合并时调用interop.word的insert函数显示无法打开先前生成的文件,尝试过多种解决方法均未解决。
1、创建类似格式的新模板文件,再用程序生成文件。结果word报错,忽略错误后所有字符均可正常显示。
2、注释部分插入段落的语句。结果word可以正常打开。(最后确认为一段插入随机字符的段落会引发报错,并且插入的数量越多越容易报错)
3、在之前插入随机字符的段落前新建一个字符串,把所有随机字符替换为该字符串并插入word中。结果word可以正常打开。
4、注释掉SetTableFont函数,最后生成的word同样异常。
这段随机字符生成代码在先前功能中使用过多次,均没有发生这个问题。
救命,研究了七八个小时了还在原地转圈
直接引发问题的程序段落:
table1、table2:上文定义的用于存储模板word中两个表格的变量
datetime:DateTime数组,存储一组随机生成的开始时间
dt:int数组,存储一组随机生成的持续时间
for (int i = 1; i <= leadnum; i++)
{
XWPFTable table;
XWPFTableRow row;
if (i <= 24)
{
table = table1;
row = table.GetRow(i + 5);
}
else
{
table = table2;
row = table.GetRow(i - 19);
}
row.GetCell(1).SetParagraph(SetTableFont(table, datetime[i - 1].ToString("H:mm"), ParagraphAlignment.CENTER, 12, "FF0000"));
row.GetCell(2).SetParagraph(SetTableFont(table, datetime[i - 1].AddMinutes(dt[i - 1]).ToString("H:mm"), ParagraphAlignment.CENTER, 12, "FF0000"));
row.GetCell(3).SetParagraph(SetTableFont(table, (gradeinfo.lead_len + 0.05 + (rand.Next() % 6) * 0.01).ToString("f2"), ParagraphAlignment.CENTER, 12, "FF0000"));
row.GetCell(4).SetParagraph(SetTableFont(table, (gradeinfo.lead_spc * 1000 - 30 + (rand.Next() % 7) * 10).ToString("f0"), ParagraphAlignment.CENTER, 12, "FF0000"));
row.GetCell(5).SetParagraph(SetTableFont(table, (rand.Next() % 3).ToString("f0"), ParagraphAlignment.CENTER, 12, "FF0000"));
if (gradeinfo.grade == "V")
{
row.GetCell(6).SetParagraph(SetTableFont(table, (gradeinfo.lead_grt_pre + (rand.Next() % 11) * 0.1).ToString("f1"), ParagraphAlignment.CENTER, 12, "FF0000"));
row.GetCell(7).SetParagraph(SetTableFont(table, (gradeinfo.lead_grt_vol + (rand.Next() % 21)).ToString("f0"), ParagraphAlignment.CENTER, 12, "FF0000"));
}
GC.Collect();
}
for (int i = 0; i < 8; i++)
{
table1.GetRow(32).GetCell(i).SetBorderRight(XWPFTable.XWPFBorderType.SINGLE, 8, 0, "000000");
table1.GetRow(32).GetGetCell(i + 1).SetBorderLeft(XWPFTable.XWPFBorderType.SINGLE, 8, 0, "000000");
table2.GetRow(32).GetCell(i).SetBorderRight(XWPFTable.XWPFBorderType.SINGLE, 8, 0, "000000");
table2.GetRow(32).GetCell(i + 1).SetBorderLeft(XWPFTable.XWPFBorderType.SINGLE, 8, 0, "000000");
SetTableFront函数:
public XWPFParagraph SetTableFont(XWPFTable table, string str,ParagraphAlignment align,int size = 9,string color = "000000")
{
CT_P para = new CT_P();
para.AddNewPPr().AddNewTextAlignment();
XWPFParagraph paragraph = new XWPFParagraph(para, table.Body);
paragraph.Alignment = align;
string[] strings = str.Split('\n');
for(int i = 0; i < strings.Length; i++)
{
XWPFRun run = paragraph.CreateRun();
if (i!=0)
{
run.AddBreak(BreakType.TEXTWRAPPING);
}
run.SetText(strings[i]);
run.FontSize = size;
run.SetColor(color);
run.SetFontFamily("宋体", FontCharRange.None);
}
return paragraph;
}