search

Home  >  Q&A  >  body text

使用C#如何导入导出Excel文件?

使用C#如何导入导出Excel文件?

末日的春天末日的春天2871 days ago1902

reply all(2)I'll reply

  • 数据分析师

    数据分析师2017-10-01 00:19:19

    How to import and export Excel files using C#? -PHP Chinese website Q&A-How to import and export Excel files using C#? -PHP Chinese website Q&A

    Let’s take a look and learn.

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-02-15 09:18:09

    OleDB是微软的战略性的通向不同的数据源的低级应用程序接口。支持很多种数据库,此客户端中DBF文件的输入输出也是使用了此数据库API。使用OleDB记得添加上命名空间:

    using System.Data.OleDb;

    xlsx文件的输入:

    private void inputXlsx()
    {
        string strConn2;
        string filePath = inPath;
        FileInfo fileInfo = new FileInfo(filePath);
        string directory = fileInfo.DirectoryName;
     
        strConn2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';
        Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';";
        string strConnection = string.Format(strConn2, inPath);
        OleDbConnection conn = new OleDbConnection(strConnection);
        try
        {
            conn.Open();
            String tableName = null;
            DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            tableName = dt.Rows[0][2].ToString().Trim();
            OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + tableName + "]", strConnection);
            oada.Fill(dtOld);
            conn.Close();  
        }
        catch (Exception ex)
        {
            conn.Close();
        }
    }

    xlsx文件的中间处理过程因需求而异,在此不再赘述处理方式。在输入过程中,将文件中的数据转化成了Datatable数据类型的格式,它是一个临时保存数据的网格虚拟表,处理非常方便。

    xlsx文件的输出:xlsx文件的输出过程并不是很顺利,先后使用了三种方式。

    第一种方式自然就是OleDB了,有始有终嘛。但是真正使用的过程中发现此方式不仅要求程序运行本机必须安装Excel,而且对Excel版本要求非常高,如果删注册表很容易弄巧成拙,我改注册表就直接玩坏了Excel。事实上我们并不能保证客户的机器上一定安装了对应版本的Excel,所以如果使用OleDB输出文件,此客户端的兼容性将非常的低劣。

    经过一番沟通和挣扎决定还是换一种方式,决定改用第三方组件。由于JAVA方使用的是POI,所以这边直接使用POI项目的.NET版本,NPOI。网上教程很多,很好实现,但是经过测试之后,此种方式对大文件的输入输出支持的不是很好,处理DEMO文件没有问题,但是换成了真正客户提供的十万行级甚至百万行级的文件,客户端直接在输出的过程中崩掉。

    查询资料后,网友们对于大文件都建议使用EPPlus。教程也是一抓一大把,我没有继续加大文件大小测试,不过客户给我们提供的十来个文件全部测试通过,基本上都是百万级以下的。

    上代码吧:

    private void outputXlsx()
    {
        FileInfo newFile = new FileInfo(dtNew.TableName + ".xlsx");
        if (newFile.Exists)
        {
            newFile.Delete();
            newFile = new FileInfo(dtNew.TableName + ".xlsx");
        }
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dtNew.TableName);//创建worksheet
     
            for (int m = 0; m < dtNew.Columns.Count; m++)
            {
                worksheet.Cells[1, m + 1].Value = dtNew.Columns[m];
            }
            int i = 1;
            foreach (DataRow dr in dtNew.Rows)
            {
                for (int j = 0; j < dtNew.Columns.Count; j++)
                {
                    worksheet.Cells[i + 1, j + 1].Value = dr[j];
                }
                i++;
            }
            package.Save();//保存excel
        }
    }


    reply
    0
  • Cancelreply