2012-11-15 70 views
2

我正在使用Excelpackage.codeplex.com創建xlsx。使用C#使用ExcelPackage無法創建帶撇號的XLSX

當用撇號(')寫一個字符串時,我得到一個System.Xml.XPath.XPathException異常。

如何使用該軟件包編寫xlsx單元?

private void ExportApostrphoe() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("ID", typeof(int)); 
     dt.Columns.Add("Name"); 

     dt.Rows.Add(1, "Ben"); 
     dt.Rows.Add(2, "Joe's"); 
     dt.Rows.Add(3, "Mike"); 

     FileInfo newFile = new FileInfo(@"c:\1.xlsx"); 
     using (ExcelPackage xlPackage = new ExcelPackage(newFile)) 
     { 
      OfficeOpenXml.ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add("Sheet1"); 
      for (int x = 0; x < dt.Columns.Count; ++x) 
      { 
       DataColumn column = dt.Columns[x]; 
       worksheet.Cell(1, 1 + x).Value = column.Caption; 

      } 
      for (int x = 0; x < dt.Columns.Count; ++x) 
      { 
       for (int y = 0; y < dt.Rows.Count; ++y) 
       { 
        worksheet.Cell(2 + y, 1 + x).DataType = "text"; 
        worksheet.Cell(2 + y, 1 + x).Value = Convert.ToString(dt.Rows[y][x]); 

       } 

      } 
      xlPackage.Save(); 
     } 
    } 
+0

我希望你必須使用'上的轉義字符。對於C#或codeplex,我不確定。 – Pynner

回答

0

嘗試更新ExcelCell.cs 搜索follwoing代碼XmlNode stringNode和更新與相同下面的代碼。創建一個DLL。它爲我工作。

XmlNode stringNode = _xlWorksheet.xlPackage.Workbook.SharedStringsXml.SelectSingleNode(string.Format("//d:si[d:t='{0}']", System.Security.SecurityElement.Escape(Value)), _xlWorksheet.NameSpaceManager); 
0

這個名爲CodePlex網站庫有一定的職位,通過更改源和重新編譯庫中引用一個解決方法,但對於一個快速的修復,我已經能夠解決它通過替換單引號「正確的單引號」。

所以「鮑勃」最終成爲「鮑勃」 - 這是完全可以接受的我的目的。

我寫它作爲一個擴展的方法:

public static string ReplaceSingleQuote(this string s) { 
    if (!string.IsNullOrEmpty(s)) 
    return s.Replace('\u0027', '\u2032'); 
    else 
    return s; 
} 

因此,例如,你會改變線路:

worksheet.Cell(2 + y, 1 + x).Value = Convert.ToString(dt.Rows[y][x]); 

到:

worksheet.Cell(2 + y, 1 + x).Value = Convert.ToString(dt.Rows[y][x]).ReplaceSingleQuote();