47730


EPPlusを使用してPivotTablesを作成する時、タイトル行となる先頭行の文字列が"<"を含んでいると`System.Xml.XmlException`例外が発生します。(エラー詳細は末尾に記載しました)

タイトル行の文字列に対して"<"を"＜"に置換すれば無理やり例外を回避することは可能ですが、文字列を修正せずに回避する方法があればご教示願います。

OS: Windows 10 64bit  
.Net Framework: 4.6.1  
EPPlus: 4.5.2.1 (質問日にNugetで最新を取得したもの)

サンプルコード:

[code]

    using OfficeOpenXml;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var package = new ExcelPackage())
                {
                    var book = package.Workbook;
                    var dataSheet = package.Workbook.Worksheets.Add("Data");
                    var pivotSheet = package.Workbook.Worksheets.Add("Pivot");
                    dataSheet.Cells[1, 1].Value = "<";  //タイトル行が"<"を含むと例外 (ただし">"ならばOK)
                    dataSheet.Cells[2, 1].Value = "<";  //データ行ならOK
                    pivotSheet.PivotTables.Add(pivotSheet.Cells[1, 1], dataSheet.Cells[1, 1, 2, 1], "Table"); //ここで例外が発生する
                    package.SaveAs(new FileInfo("test.xlsx"));
                }
            }
        }
    }
    
[/code]

エラー詳細:

[code]

    System.Xml.XmlException
      HResult=0x80131940
      Message='<' (16 進数値 0x3C) は無効な属性文字です。 行 1、位置 458。
      Source=System.Xml
      スタック トレース:
       場所 System.Xml.XmlTextReaderImpl.Throw(Exception e)
       場所 System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
       場所 System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)
       場所 System.Xml.XmlTextReaderImpl.ParseAttributes()
       場所 System.Xml.XmlTextReaderImpl.ParseElement()
       場所 System.Xml.XmlTextReaderImpl.ParseElementContent()
       場所 System.Xml.XmlTextReaderImpl.Read()
       場所 System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
       場所 System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
       場所 System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
       場所 System.Xml.XmlDocument.Load(XmlReader reader)
       場所 OfficeOpenXml.XmlHelper.LoadXmlSafe(XmlDocument xmlDoc, Stream stream)
       場所 OfficeOpenXml.XmlHelper.LoadXmlSafe(XmlDocument xmlDoc, String xml, Encoding encoding)
       場所 OfficeOpenXml.Table.PivotTable.ExcelPivotCacheDefinition..ctor(XmlNamespaceManager ns, ExcelPivotTable pivotTable, ExcelRangeBase sourceAddress, Int32 tblId)
       場所 OfficeOpenXml.Table.PivotTable.ExcelPivotTable..ctor(ExcelWorksheet sheet, ExcelAddressBase address, ExcelRangeBase sourceAddress, String name, Int32 tblId)
       場所 OfficeOpenXml.Table.PivotTable.ExcelPivotTableCollection.Add(ExcelAddressBase Range, ExcelRangeBase Source, String Name)
       場所 ConsoleApp1.Program.Main(String[] args) (C:\Users\{Who am I}\Documents\Visual Studio 2017\Projects\ConsoleApp1\Program.cs):行 22
    
[/code]


CC BY-SA 4.0
2018-06-22T01:36:36.477
44978
2018-08-22T11:12:10.520
2018-06-22T22:59:59.170
9820
9820
question
c# excel epplus
EPPlusのピボットテーブルでタイトル行が"<"を含むとXmlExceptionが発生する


[EPPlus](https://github.com/JanKallman/EPPlus)のソースコードを調べたところ、ピボットテーブルのヘッダを作成するときにXmlの属性に割り当てる処理でエスケープしていないことが原因でした。

`ExcelPivotCacheDefinition.cs`の281行目辺りを下記のように書き換えると正常に動作します。  
(修正は自己責任でお願いします)

[code]

    var s=sourceWorksheet.GetValueInner(sourceAddress._fromRow, col).ToString();
    xml += string.Format("<cacheField name=\"{0}\" numFmtId=\"0\">", System.Security.SecurityElement.Escape(s));
    
[/code]

なお、この修正についてはGithubで[Issue](https://github.com/JanKallman/EPPlus/issues/295)と[プルリクエスト](https://github.com/JanKallman/EPPlus/pull/296)を投げました。


CC BY-SA 4.0
2018-08-22T11:12:10.520
47730
2018-08-22T11:12:10.520
9820
44978
answer