C# Excel文件与DataTable之间的转换

.net环境通过NPOI插件实现Excel与DataTable之间的转换

需要应用相应的dll,链接:下载插件.
也可以直接通过nuget导入,更方便
详细使用查看注释

using System;
using System.Data;
using System.IO;
using System.Collections.Generic;

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

namespace ExcelMVC.Class
{
    public class ExcelTool
    {

        /// <summary>
        /// 将Excel解析为List<DataTable>,每一个sheet为一个DataTable
        /// </summary>
        /// <param name="stream">文件流</param>
        /// <returns>DataTable类型列表</returns>
        /// 使用方法:
        /// List<DataTable> list = null;
        /// using (System.IO.Stream stream = 文件流)
        /// {
        ///     list = ExcelTool.ExcelToDataTables(stream);
        ///     stream.Close();
        ///     stream.Dispose();
        /// }
        public static List<DataTable> ExcelToDataTables(Stream stream, bool isXlsx)
        {
            List<DataTable> list = new List<DataTable>();
            IWorkbook workbook = null;
            if (isXlsx)
                workbook = new XSSFWorkbook(stream);
            else
                workbook = new HSSFWorkbook(stream);
            stream.Close();
            stream.Dispose();
            ISheet sheet = null;
            int index = 0;
            //循环获取每个表
            do
            {
                sheet = workbook.GetSheetAt(index);
                index++;
                DataTable dt = new DataTable(sheet.SheetName);
                //获取标题
                IRow Colunm = sheet.GetRow(0);
                foreach (ICell item in Colunm.Cells)
                {
                    dt.Columns.Add(new DataColumn(item.StringCellValue));
                }
                //获取数据
                for (int i = 0; i < sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i + 1);
                    if (row == null)
                        continue;
                    DataRow dr = dt.NewRow();
                    bool HasValue = false;
                    for (int j = 0; j < Colunm.LastCellNum; ++j)
                    {
                        if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
                        {
                            row.GetCell(j).SetCellType(CellType.String);
                            dr[j] = row.GetCell(j).StringCellValue;
                            HasValue = true;
                        }
                    }
                    if (HasValue)
                        dt.Rows.Add(dr);
                }
                list.Add(dt);
            } while (index < workbook.NumberOfSheets);
            return list;
        }

        /// <summary>
        /// 数据导出至excel文件,默认第一行为列名
        /// ms.Close();
        /// ms.Dispose();
        /// </summary>
        /// <param name="dt">数据源,DataTable类型</param>
        /// <returns>数据流</returns>
        /// WebFrom使用方式:
        /// using(MemoryStream ms = ExcelTool.DataTableToExcel(DataTable类型数据源))
        /// {
        ///     Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode(文件名称, System.Text.Encoding.UTF8)));
        ///     Response.BinaryWrite(ms.ToArray());
        ///     Response.Flush();
        ///     Response.End();
        /// }
        /// MVC使用方式:
        /// 控制器返回类型FileResult
        /// MemoryStream ms = ExcelTool.DataTableToExcel(DataTable类型数据源);
        /// return File(ms, "application/vnd.ms-excel", 文件名称带后缀);
        public static MemoryStream DataTableToExcel(DataTable dt)
        {
            if (dt == null)
                throw new Exception("数据源无数据");
            //创建Excel文件的对象
            HSSFWorkbook book = new HSSFWorkbook();
            //添加一个sheet
            ISheet sheet1 = book.CreateSheet(dt.TableName);
            //写入标题
            IRow Column = sheet1.CreateRow(0);
            foreach (DataColumn item in dt.Columns)
            {
                Column.CreateCell(dt.Columns.IndexOf(item)).SetCellValue(item.ColumnName);
            }
            //将数据逐步写入sheet1各个行
            foreach (DataRow dr in dt.Rows)
            {
                IRow rowtemp = sheet1.CreateRow(dt.Rows.IndexOf(dr) + 1);
                for (int j = 0; j < dr.ItemArray.Length; j++)
                {
                    rowtemp.CreateCell(j).SetCellValue((string)dr.ItemArray[j]);
                }
            }
            // 写入到文件流
            MemoryStream ms = new MemoryStream();
            book.Write(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return ms;
        }

    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Drumsticks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值