单声道EPPlus文件加载问题

时间:2014-10-27 08:26:10

标签: excel mono epplus

我使用以下代码通过EPPlus库将excel文件读入数据表:

public static DataTable GetDataTableFromExcel(string path)
    {
        DataTable tbl = new DataTable();
        using (var pck = new ExcelPackage())
        {
            using (var stream = File.OpenRead(path))
            {
                pck.Load(stream);                    
            }

            //GET FIRST SHEET IN EXCEL FILE
            var ws = pck.Workbook.Worksheets.First();

            bool hasheader = true; // adjust it accordingly( i've mentioned that this is a simple approach)

            //ADD COLUMNS (SCHEMA) TO DATATABLE
            foreach (var firstrowcell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
            {
                tbl.Columns.Add(hasheader ? firstrowcell.Text : string.Format("column {0}", firstrowcell.Start.Column));
            }

            //IF THE EXCEL SHEET HAS FIRST ROW AS COLUMN NAMES THAN START FROM 2nd ROW Else FROM FIRST ROW
            var startrow = hasheader ? 2 : 1;

            for (var rownum = startrow; rownum <= ws.Dimension.End.Row; rownum++)
            {
                //ws.Cells[rownum, 1, rownum, ws.Dimension.End.Column].Style.Numberformat.Format = "General";
                var wsrow = ws.Cells[rownum, 1, rownum, ws.Dimension.End.Column];
                var row = tbl.NewRow();
                foreach (var cell in wsrow)
                {
                    if (cell.Start.Column > 20)
                        continue;
                    if (cell.Start.Column == 20)
                    {
                        DateTime dt = new DateTime(1947, 1, 1);
                        DateTime.TryParse(cell.Value.ToString(), out dt);

                        if (dt == new DateTime(0001, 1, 1))
                        {
                            long serialDate = long.Parse(cell.Value.ToString());
                            DateTime result = DateTime.FromOADate(serialDate);
                            row[cell.Start.Column - 1] = result.ToString();
                        }
                        else
                            row[cell.Start.Column - 1] = cell.Value;
                    }
                    else
                        row[cell.Start.Column - 1] = cell.Text;
                }
                tbl.Rows.Add(row);
            }

        }
        return tbl;
    } 

在我的应用程序中,我选择一个excel文件,而不是使用EPPlus将Excel转换为DataTable,如果我选择一个新文件,则在GridView中加载datatable-将调用上述方法并在GridView中加载数据。

但这不适用于Mono。这适用于.Net但是当我从浏览按钮中选择不同的文件时,使用相同的代码,第一个文件会一次又一次地加载。 要加载新文件,我必须关闭应用程序并再次运行。

方法代码有什么问题吗? 我需要在某个地方关闭/卸载EP代码中的Excel吗?

此致

1 个答案:

答案 0 :(得分:0)

非常感谢你的回复。我遇到了这个问题。我正在使用app.config文件并在运行时修改它以保存文件路径并从app.config获取路径以将文件加载到网格中。要在app.config中获取新的更改,我们必须重新加载应用程序。