c# – Excel中的彩色文本部分> 255个字符
发布时间:2020-12-15 21:01:35 所属栏目:百科 来源:网络整理
导读:我为第三方sw编写了一个插件,它将修改后的文本提取到Excel工作表中,然后在Excel中为已更改的部分着色. 只要每个文本段(=单元格内容)不超过255个字符,这就可以工作.唉,这可以而且偶尔也会发生. 为了在Excel中识别更改的部分,我用 del来包围它们. RESP. 添加删
我为第三方sw编写了一个插件,它将修改后的文本提取到Excel工作表中,然后在Excel中为已更改的部分着色.
只要每个文本段(=单元格内容)不超过255个字符,这就可以工作.唉,这可以而且偶尔也会发生. 为了在Excel中识别更改的部分,我用< del>来包围它们. RESP. <添加>删除和添加文本的标签.然后我为这些部分着色(并删除周围的标签),如下所示: while (((string)cell1.Text).Contains("<del>")) { try { var pos = ((string) cell1.Text).IndexOf("<del>") + 1; var pos2 = ((string) cell1.Text).IndexOf("</del>") + 1; var txt = cell1.Characters[pos,(pos2-pos) + 9].Text; txt = txt.Replace("<del>","").Replace("</del>",""); cell1.Characters[pos,(pos2-pos) + 9].Text = txt; cell1.Characters[pos,txt.Length-3].Font.Color = -16776961; } catch { break; } } 我正在使用Interop,因为我发现它更容易使用,也因为我找不到任何关于如何使用OpenXML执行此操作的体面示例.但是我知道Excel在单元格文本方面有其局限性,所以我愿意接受建议. 有没有办法使用Interop为包含> 255个字符的单元格中的单个单词着色? 如果一切都失败了,我可能不得不创建一个带有表的Word文档,在那里进行格式化,然后复制/粘贴到Excel(yukk).请帮我避免这种丑陋. P.S:是的,修订摘要需要基于Excel. 解决方法
好的,我现在用OpenXML解决了它.
如果一个单元格包含要着色的文本,我会创建一个文本到该位置,第二个包含受影响文本的彩色运行,以及包含其余文本的第三个返回默认运行. var xlsx = SpreadsheetDocument.Open(xlsPath,true); var contents = xlsx.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First(); foreach (SharedStringItem si in contents.SharedStringTable.Elements<SharedStringItem>()) { if (si.Text != null) { XlHelper.ColorCellText(si,"del",new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = "FFFF0000" }); XlHelper.ColorCellText(si,"add",new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = "0000BF00" }); } } 和我的XlHelper.ColorCellText方法: public static void ColorCellText(SharedStringItem si,string TagName,DocumentFormat.OpenXml.Spreadsheet.Color col) { var newText = si.InnerText; var startTag = string.Format("<{0}>",TagName); var endTag = string.Format("</{0}>",TagName); if (newText.Contains(startTag)) { si.Text.Remove(); var lastpos = 0; while (newText.Contains(startTag)) { try { var pos1 = newText.IndexOf(startTag); var pos2 = newText.IndexOf(endTag); var txtLen = pos2 - pos1 - 5; var it = string.Concat(newText.Substring(0,pos1),newText.Substring(pos1 + 5,txtLen),newText.Substring(pos2 + 6)); var run = new Run(); var txt = new Text { Text = it.Substring(0,Space = SpaceProcessingModeValues.Preserve }; run.Append(txt); si.Append(run); run = new Run(); txt = new Text { Text = it.Substring(pos1,Space = SpaceProcessingModeValues.Preserve }; var rp = new RunProperties(); rp.Append(col.CloneNode(true)); run.RunProperties = rp; run.Append(txt.CloneNode(true)); si.Append(run.CloneNode(true)); newText = newText.Substring(pos2 + 6); } catch(Exception ex) { using (var sw = new StreamWriter(logFile,true)) { sw.WriteLine("Error: {0}rn{1}",ex.Message,newText); } break; } } if (newText.Length>=0) { var lastrun = new Run(); var lasttxt = new Text { Text = newText,Space = SpaceProcessingModeValues.Preserve }; lastrun.Append(lasttxt); si.Append(lastrun); } } } Space = SpaceProcessingModeValues.Preserve部分在这里至关重要,否则它会将所有三个部分粘合在一起并消除它们之间的空格. 我想我会调查这个EPPlus,因为它的“In-cell Richtext”功能听起来很有希望. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |