C#NPOI 往excel里面追加一行或者一个Datatable

Excel数据追加利器
本文介绍了一种在Excel中追加DataTable和DataRow的方法,适用于在已有Excel文件中追加大量数据而无需重新创建整个文件。文章详细解释了如何判断Excel文件类型、创建不同类型的IWorkbook对象、获取工作表、追加数据并保存修改后的文件。
 /// <summary>
        /// 追加记录DataTable(不含表头,将表内容直接追加进去至末尾)
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="sheetIndex">目标表下标</param>
        /// <param name="dt">表格</param>
        /// <returns></returns>
        public static bool AppendDataTableToExcel(string path, int sheetIndex, DataTable dt,bool hasFieldRow = true)
        {
            try
            {
                //获取文件流
                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    IWorkbook workbook;

                    //获取excel的文件类型
                    ExcelType type = GetExcelFileType(path).Value;
                    //通过不同的文件类型创建不同的读取接口(xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现)
                    switch (type)
                    {
                        case ExcelType.xlsx:
                            workbook = new XSSFWorkbook(stream);
                            break;
                        default:
                            workbook = new HSSFWorkbook(stream);
                            break;
                    }
                    //
                    ISheet sheet = null;
                    //获取工作表,默认获取第一张
                    if (workbook.NumberOfSheets > sheetIndex && workbook.NumberOfSheets > 0)
                    {
                        sheet = workbook.GetSheetAt(sheetIndex);
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("索引超出界限或该文件表格为空!");
                    }
                    //是否已经获取工作表,如果没有则直接返回
                    if (sheet == null)
                    {
                        return false;
                    }

                    #region//往表中追加Datatable
                    if (hasFieldRow)//判断是否添加表头
                    {
                        
                        //添加表头(当表为空时从0开始,不为空则加1)
                        IRow headRow = sheet.CreateRow(sheet.LastRowNum+(sheet.LastRowNum==0?0:1));
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            //获取单元格
                            ICell cell = headRow.CreateCell(i);
                            //设置单元格数据类型
                            cell.SetCellType(CellType.String);
                            //单元格赋值
                            cell.SetCellValue(dt.Columns[i].ColumnName.ToString());
                        }
                    }
                    //添加表头为1,不添加表头为0
                    int starRow;
                    if (hasFieldRow)
                    {
                        starRow = 1;
                    }
                    else
                    {
                        starRow = 0;
                    }

                    //遍历行
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        //创建行
                        IRow cells = sheet.CreateRow(sheet.LastRowNum + starRow);
                        //遍历列
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            //创建单元格
                            ICell cell = cells.CreateCell(j);
                            //设置单元格属性
                            cell.SetCellType(CellType.String);
                            //单元格赋值
                            cell.SetCellValue(dt.Rows[i][j].ToString());
                        }

                    }
                    #endregion

                    //保存
                    bool success = Export(workbook, path);

                    return success;
                }
            }
            catch
            {
                return false;
            }
        }


        /// <summary>
        /// 追加记录DataRow
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="sheetIndex">目标表下标</param>
        /// <param name="dr">行数据</param>
        /// <returns></returns>
        public static bool AppendDataRowToExcel(string path, int sheetIndex, DataRow dr)
        {
            try
            {
                //获取文件流
                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    IWorkbook workbook;

                    //获取excel的文件类型
                    ExcelType type = GetExcelFileType(path).Value;
                    //通过不同的文件类型创建不同的读取接口(xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现)
                    switch (type)
                    {
                        case ExcelType.xlsx:
                            workbook = new XSSFWorkbook(stream);
                            break;
                        default:
                            workbook = new HSSFWorkbook(stream);
                            break;
                    }
                    //
                    ISheet sheet = null;
                    //获取工作表,默认获取第一张
                    if (workbook.NumberOfSheets > sheetIndex && workbook.NumberOfSheets > 0)
                    {
                        //获取工作表
                        sheet = workbook.GetSheetAt(sheetIndex);
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("索引超出界限或该文件表格为空!");
                    }
                    //是否已经获取工作表,如果没有则直接返回
                    if (sheet == null)
                    {
                        return false;
                    }

                    #region//往表中追加Datatable(没有追加表头数据)
                    //创建行单元(当表为空时从0开始,不为空则加1)
                    IRow cells = sheet.CreateRow(sheet.LastRowNum+(sheet.LastRowNum==0?0:1));
                    //遍历列
                    for (int j = 0; j < dr.ItemArray.Length; j++)
                    {
                        //创建单元格
                        ICell cell = cells.CreateCell(j);
                        //设置单元格属性
                        cell.SetCellType(CellType.String);
                        //单元格赋值
                        cell.SetCellValue(dr.ItemArray[j].ToString());
                    }
                    #endregion

                    //保存
                    bool success = Export(workbook, path);

                    return success;
                }
            }
            catch
            {
                return false;
            }
        }



/// <summary>
        /// 将表格存储为Excel
        /// </summary>
        /// <param name="workbook"></param>
        /// <returns></returns>
        private static bool Export(IWorkbook workbook,string path)
        {
            try
            {
                FileInfo file = new FileInfo(path);
                if (file.Exists)
                {
                    file.Delete();
                    file = new FileInfo(path);
                }

                // 写入 ,创建其支持存储区为内存的流
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                //写入内存
                workbook.Write(ms);
                workbook = null;
                //
                FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
                byte[] data = ms.ToArray();
                fs.Write(data, 0, data.Length);
                fs.Flush();
                //关闭
                ms.Close();
                //释放
                ms.Dispose();
                //
                fs.Close();

                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

在使用 NPOI 库进 Excel 文件操作时,可以通过 C# 实现创建 Excel 文件并逐写入数据的功能。以下是一个完整的示例代码,展示了如何使用 NPOI 创建新的 Excel 文件,并将数据逐写入工作表中: ```csharp using System; using System.Data; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; class Program { static void Main(string[] args) { // 创建一个新的Excel工作簿 IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建DataTable作为数据源 DataTable dataTable = new DataTable("MyTable"); dataTable.Columns.Add("ID", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Rows.Add(1, "Alice"); dataTable.Rows.Add(2, "Bob"); // 逐写入数据到Excel int rowIndex = 0; foreach (DataRow row in dataTable.Rows) { IRow excelRow = sheet.CreateRow(rowIndex++); for (int i = 0; i < dataTable.Columns.Count; i++) { excelRow.CreateCell(i).SetCellValue(row[i].ToString()); } } // 保存Excel文件到磁盘 using (FileStream fs = new FileStream("output.xlsx", FileMode.Create, FileAccess.Write)) { workbook.Write(fs); } } } ``` 此代码首先创建了一个新的 `XSSFWorkbook` 对象,用于表示 Excel 文件的内容。随后,通过 `CreateSheet` 方法创建一个名为 “Sheet1” 的工作表。接着,定义了一个 `DataTable` 作为数据源,并将其内容逐写入到工作表中。每一行数据通过 `IRow` 接口创建,每个单元格通过 `ICell` 接口设置值。 如果需要追加数据到已有的 Excel 文件末尾,可以参考如下实现方式: ```csharp public void AppendDataToExistingExcel(string filePath, DataTable dataTable) { IWorkbook workbook; using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { workbook = filePath.EndsWith(".xlsx") ? (IWorkbook)new XSSFWorkbook(stream) : new HSSFWorkbook(stream); } var sheet = workbook.GetSheetAt(0); int lastRowNum = sheet.LastRowNum; for (int i = 0; i < dataTable.Rows.Count; i++) { var dataRow = sheet.CreateRow(lastRowNum + i + 1); for (int j = 0; j < dataTable.Columns.Count; j++) { dataRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString()); } } using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Write)) { workbook.Write(stream); } } ``` 上述方法允许将数据追加到现有 Excel 文件的末尾,通过获取当前工作表的最后一行索引 `LastRowNum`,并在该之后添加新数据。这种方式适用于动态更新已有数据集的需求 [^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值