2016-08-18 10 views
4

改訂されたテキストをExcelシートに抽出し、変更された部分をExcelで色分けするサードパーティswのプラグインを作成しました。 各テキストセグメント(=セルの内容)が255文字を超えない限り、これは機能します。うーん、これは時々起こることがあります。Excelのカラーテキスト部分> 255文字

Excelで変更された部分を識別するために、私はそれらを<del> respで囲みます。 <add>削除され、追加されたテキストのタグ。それから私は、これらの部品を色(とその周辺のタグを削除)このように:私が行う方法上の任意のまともな例を見つけることができなかったので、

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; 
    } 
} 

また、私はそれがはるかに簡単で動作するように見つけるため、相互運用機能を使用して、としていますこれはOpenXMLによる。しかし、Excelにはセルテキストについては限界があることを知っていますので、私は提案をすることができます。

Interopを使用して> 255文字を含むセルに単一の単語を表示する方法はありますか?

すべてが失敗したら、おそらくテーブルでWord文書を作成し、そこで書式を設定してExcel(yukk)にコピー/ペーストする必要があります。この醜さを避けてください。

P .:はい、リビジョンの概要はExcelベースである必要があります。

+0

cell.Textの代わりにcell.Valueを使用してください。少なくともEPPlusでは、Textはユーザーに表示される値で、Valueはセルの内容です。そのため、列の幅がコンテンツよりも小さい場合、TextプロパティはValueプロパティとは異なる値になります。 – Magnetron

+0

いいえ文字にはValueプロパティはありません。 – LocEngineer

+0

@ Magnetron申し訳ありませんが、少し厚かったです。もちろん、 'cell.Value'を使うことができます。しかし、違いはありません。セル> 255の場合はまだ結果はありません。 – LocEngineer

答えて

0

[OK]を今すぐOpenXMLで解決しました。 セルに色付けされるテキストが含まれている場合は、その位置までのテキストの実行を作成し、2番目に影響を受けるテキストを含む色付きの実行と、残りの3番目のバックツーデフォルトの実行を作成します。

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, pos1), 
        Space = SpaceProcessingModeValues.Preserve 
       }; 
       run.Append(txt); 
       si.Append(run); 

       run = new Run(); 
       txt = new Text 
       { 
        Text = it.Substring(pos1, txtLen), 
        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}\r\n{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の部分は、それが一緒にすべての3つの部品を接着し、間にスペースを閉じますが、ここではALS他に重要です。

"In-Cell Richtext"機能はかなり有望であると思うので、私はこのEPPlusを見ていきたいと思います。

+0

OpenXMLのドキュメントは低レベルであり、実際にはExcelのモデルを理解する必要があります - セルにはスタイルがあります。 Excelを使用するときにスタイルを適用できるように、SDKを使用してスタイルを適用できます。 * text *を実際に変更する必要はありません。 EPPlusのような上位レベルのライブラリはこれをもっと簡単にし、スタイリングの例を含んでいます –

関連する問題