2016-08-18 1 views
4

수정 된 텍스트를 Excel 시트로 추출한 후 Excel에서 변경된 부분의 색상을 지정하는 제 3 자 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; 
    } 
} 

내가 훨씬 쉽게 작업 할 찾을 수 있기 때문에 내가 Interop를 사용하고, 그리고 또한 내가 수행하는 방법에 대한 어떤 점잖은 예를 찾을 수 있기 때문에 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

좋아요, 이제 OpenXML로 해결했습니다. 셀에 색칠 할 텍스트가 포함되어 있으면 그 위치까지 텍스트의 런을 만들고 두 번째로 영향을받는 텍스트가 포함 된 컬러 실행을 만들고 나머지는 포함하는 세 번째 back-to-default 실행을 만듭니다.

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 부분은 여기에 중요하다, 루게릭 병은 다른 사람이 모두 함께 세 부분을 접착제와 사이의 공간을 기각한다.

"In-Cell Richtext"기능이 다소 유망하다고 생각하기 때문에이 EPPlus를 살펴볼 것입니다.

+0

OpenXML 설명서는 저급이 아니며 Excel의 모델을 이해해야합니다. 셀에는 스타일이 있습니다. Excel을 사용할 때 스타일을 적용 할 수있는 것처럼 SDK를 사용하여 스타일을 적용 할 수 있습니다. 실제로 * 텍스트 *를 수정할 필요가 없습니다. EPPlus와 같은 상위 레벨 라이브러리는 훨씬 쉽게 만들고 스타일 예제를 포함합니다. –