【茶包射手日記】EPPlus無法開啟ReportViewer匯出xlsx檔

使用EPPlus 3.1.2開啟RDLC匯出的xlsx檔,讀取ExcelPackage.Workbook.Worksheets時發生錯誤:

System.ArgumentNullException: Value cannot be null.
Parameter name: String

既然EPPlus是Open Source,照慣例 -- "Use the Source, Luke!"

追進原始碼,找到案發現場 -- ExcelWorksheet.cs LoadColumns(),爆炸點在xr.GetAttribute(“min”)傳回null,導致int.Parse()出錯。

        private void LoadColumns (XmlTextReader xr)//(string xml)
        {
            var colList = new List<IRangeID>();
            if (ReadUntil(xr, "cols", "sheetData"))
            {
            //if (xml != "")
            //{
                //var xr=new XmlTextReader(new StringReader(xml));
                while(xr.Read())
                {
                    if(xr.LocalName!="col") break;
                    int min = int.Parse(xr.GetAttribute("min"));
 
                    int style;
                    if (xr.GetAttribute("style") == null || 
                        !int.TryParse(xr.GetAttribute("style"), out style))
                    {
                        style = 0;
                    }
                    ExcelColumn col = new ExcelColumn(this, min);
//...略...

追查RDLC匯出xlsx檔中的sheet1.xml,其中<cols><col>結構如下:

  <sheetViews>
    <sheetView workbookViewId="0" showGridLines="0">
    </sheetView>
  </sheetViews>
  <cols>
    <col min="1" max="1" customWidth="1" width="10.3515625">
    </col>
    <col min="2" max="2" customWidth="1" width="78.79296875">
    </col>
  </cols>
  <sheetData>
    <row r="1" ht="17" customHeight="0">

經過一番推敲,錯誤源自<col>與</col>會觸發兩次xr.Read(),第二次讀入</col>時,因屬於EndElement,xr.GetAttribute()讀不到東西,故傳回null。猜想這段寫法平日之所以運作正常,是因為絕大部分xlsx都採用<col min="1" … /> Self-Closing Tag形式,而RDLC匯出xlsx時採取較罕見的<col></col>寫法,踩中地雷而爆炸。(Excel開檔OK,應算EPPlus的Bug)

找到原因,要解決就不是難事,在xr.Read()後,加入一行避開</col>,藥到病除! (當然,也回報到CodePlex囉~)

                while(xr.Read())
                {
                    //2012-12-06 by Jeffrey Lee, to ignore </col> End Element
                    if (xr.NodeType == XmlNodeType.EndElement) continue;
                    if(xr.LocalName!="col") break;
歡迎推文分享:
Published 07 December 2012 08:56 PM 由 Jeffrey
Filed under: ,



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2012>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
【工商服務】
OrcsWeb: Windows Server Hosting
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication