C#: 利用NPOI, Excel表导入DataTable、DataTable导出Excel表

下载NPOI

1.打开visual studio,新建项目,点击项目——管理NuGet程序包——联机——搜索NPOI,安装。

Excel表导入DataTable

//引入命名空间
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
public static DataTable ExcelToDataTable(string filePath, string sheetName, bool isFirstRowColumn, int fRow, int fColumn,
            int lColumn)
        {
     
            DataTable dataTable=new DataTable();
            IWorkbook workbook = null;
            ISheet sheet = null;
            int startRow;
            int ascci = 65;

            if (filePath != null)
            {
     
                //创建文件流
                fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                if (filePath.IndexOf(".xlsx")>0)
                    workbook = new XSSFWorkbook(fs);//获取工作簿 新版本的Excel 文件名后缀.xlsx
                else if (filePath.IndexOf(".xls")>0)
                    workbook = new HSSFWorkbook(fs);//获取工作簿 旧版本的Excel 文件名后缀.xls
                fs.Close();
            }

            if (sheetName != null)
            {
     
                sheet = workbook.GetSheet(sheetName);//获取指定表
                if (sheet == null)
                    sheet = workbook.GetSheetAt(0);//获取工作簿的第一张表
            }
            else
            {
     
                sheet = workbook.GetSheetAt(0);//获取工作簿的第一张表
            }

            if (sheet != null)
            {
     
                //为dataTable创建列,列名为对应的ascci码,从A-Z
                for (int i = fColumn; i <= lColumn; i++)
                {
     
                    DataColumn dataColumn = new DataColumn(((char)ascci++).ToString());
                    dataTable.Columns.Add(dataColumn);
                }

                //判断表的首行是否为列名,当首行为列名时,选择从第二行开始读取数据
                if (isFirstRowColumn)
                    startRow = fRow + 1;
                else
                    startRow = fRow;

                for (int i = startRow; i <= sheet.LastRowNum; i++)
                {
     
                    IRow row = sheet.GetRow(i);//获取sheet表的第i行
                    if(row==null)
                        continue;

                    DataRow dataRow = dataTable.NewRow();//为dataTable创建新的一行
                    int m = 0;

                    //接下来为dataTable的单元格赋值
                    for (int j = fColumn; j <= lColumn; j++)
                    {
     
                        if (row.GetCell(j) == null)
                            dataRow[m++] = "";
                        if (row.GetCell(j) != null)
                        {
     
                            ICell cell = row.GetCell(j);//获取sheet表第i行第j列单元格的数据值

                            //判断cell这个值是 具体数值or公式 加这个判断的原因:当单元格为公式时,dataTable读取的就是公式,加了判断,能得到公式的结果
                            if (cell.CellType == CellType.Formula)//cell内容为公式
                            {
     
                                cell.SetCellType(CellType.String);//转换为string类型,得到具体值,即公式计算出来的值
                                dataRow[m++] = cell.StringCellValue;
                            }
                            else
                            {
     
                                dataRow[m++] = cell.ToString();
                            }
                        }
                    }
                    dataTable.Rows.Add(dataRow);
                }
            }
            return dataTable;
        }

DataTable导出Excel表

public static void DataTableToExcel(string filePath,DataTable dataTable)
        {
     
            IWorkbook workbook = null;
            ISheet sheet = null;

            if (filePath != null)
            {
     
                //根据不同路径的文件名,生成不同版本的Excel工作簿
                if (filePath.IndexOf(".xlsx") > 0)
                    workbook = new XSSFWorkbook();//新版Excel工作簿
                else if (filePath.IndexOf(".xls") > 0)
                    workbook = new HSSFWorkbook();//旧版Excel工作簿
            }

            //为工作簿创建sheet表,并对其进行命名
            sheet = workbook.CreateSheet("调度结果");

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
     
                //在sheet表中创建第i行
                IRow iRow = sheet.CreateRow(i);

                for (int j = 0; j < dataTable.Columns.Count; j++)
                {
     
                    double temp;
                    //将dataTable中数值类型的数据转换为double类型
                    if(double.TryParse(dataTable.Rows[i][j].ToString(),out temp))
                        iRow.CreateCell(j).SetCellValue(temp);//在sheet表的第i行创建第j列,并为其赋值
                    else
                        iRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
                }
            }

            //创建文件流
            using (fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
     
                workbook.Write(fs);//将工作簿写入文件流
            }
        }

你可能感兴趣的:(c#,excel)