質問: "<"; //データ行ならOK pivotSheet.PivotTables.Add(pivotSheet.Cells[1, 1], dataSheet.Cells[1, 1, 2, 1], "Table"); //ここで例外が発生する package.SaveAs(new FileInfo("test.xlsx")); } } } } ``` エラー詳細: ``` 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 ```
回答: EPPlusのソースコードを調べたところ、ピボットテーブルのヘッダを作成するときにXmlの属性に割り当てる処理でエスケープしていないことが原因でした。 `ExcelPivotCacheDefinition.cs`の281行目辺りを下記のように書き換えると正常に動作します。 (修正は自己責任でお願いします) ``` var s=sourceWorksheet.GetValueInner(sourceAddress._fromRow, col).ToString(); xml += string.Format("", System.Security.SecurityElement.Escape(s)); ``` なお、この修正についてはGithubでIssueとプルリクエストを投げました。