C#往现有Excel插入一个Sheet并导入DataTable

今天遇到一个需求,需要在第一个excel导出后,再在导出的excel中新增一个sheet工作表,再将一个datatable插入到新增的sheet表中,我的思路是先打开导出的excel然后插入一个sheet,再将datatable插入到sheet中就可以了。

说是这样说,然后在实现时遇到了点问题,打开已存在的excel并插入sheet后会把之前的删除掉,然后在网上搜了一下实现方法,最后经过几篇文章的综合参考,最终实现了这个功能,现在代码贴上。

代码实例:

        /// <summary>
        /// 向现有表格中新增一个Sheet2,并导入DataTable
        /// </summary>
        /// <param name="Path"></param>
        /// <param name="dt"></param>
        public void AddSheet(string Path, DataTable dt)
        {
            var SlDoc = new SLDocument(Path);
            SlDoc.AddWorksheet("OrderInfo");//添加新的sheet
            AddData(SlDoc, dt);//填充数据
            SlDoc.SaveAs(Path);
        }


        /// <summary>
        /// 把Datatable数据填充到新工作区
        /// </summary>
        /// <param name="SlDoc"></param>
        /// <param name="dt"></param>
        public void AddData(SLDocument SlDoc, DataTable dt)//针对Excel的每列进行塞数据
        {
            var strCell = GetHeaderLetters((uint)dt.Columns.Count);

            for (int j = 0; j < dt.Columns.Count; j++)
            {
                SlDoc.SetCellValue(strCell[j] + 1, dt.Columns[j].ToString());//先塞列名
            }
            if (dt != null && dt.Rows.Count > 0)
            {
                //按行进行对Excel塞查出的Table中数据
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    for (int i = 0; i < strCell.Length; i++)
                        SlDoc.SetCellValue(strCell[i] + (j + 2), dt.Rows[j][i].ToString());
                }
            }
        }



        /// <summary>
        /// 生成excel工作表列头(A\B\C\D\E\F.....AA\AB\AC...)
        /// </summary>
        /// <param name="max"></param>
        /// <returns></returns>
        public static string[] GetHeaderLetters(uint max)
        {
            var result = new List<string>();
            int i = 0;
            var columnPrefix = new Queue<string>();
            string prefix = null;
            int prevRoundNo = 0;
            uint maxPrefix = max / 26;

            while (i < max)
            {
                int roundNo = i / 26;
                if (prevRoundNo < roundNo)
                {
                    prefix = columnPrefix.Dequeue();
                    prevRoundNo = roundNo;
                }
                string item = prefix + ((char)(65 + (i % 26))).ToString(CultureInfo.InvariantCulture);
                if (i <= maxPrefix)
                {
                    columnPrefix.Enqueue(item);
                }
                result.Add(item);
                i++;
            }
            return result.ToArray();
        }

案例截图:

THE END