NPOI 将多个DataTable数据导入到excel中,并输出到浏览器下载

        /// <summary>
        /// 将多个DataTable数据导入到excel中
        /// </summary>
        /// <param name="dts">要导入的数据集合</param>
        /// <param name="strExcelFileName">定义Excel文件名</param>
        /// <param name="indexType">给个 1 就行</param>
        public static bool DataTableToExcels(List<DataTable> dts, string strExcelFileName, int indexType)
        {
            bool BSave = false;
            try
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                DataSet set = new DataSet();
                ICellStyle HeadercellStyle = workbook.CreateCellStyle();
                foreach (DataTable dt in dts)
                {
                    ISheet sheet = workbook.CreateSheet(dt.TableName);


                    HeadercellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    HeadercellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    HeadercellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
                    HeadercellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
                    HeadercellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                    //字体
                    NPOI.SS.UserModel.IFont headerfont = workbook.CreateFont();
                    headerfont.Boldweight = (short)FontBoldWeight.Bold;
                    HeadercellStyle.SetFont(headerfont);


                    //用column name 作为列名
                    int icolIndex = 0;
                    IRow headerRow = sheet.CreateRow(0);
                    foreach (DataColumn item in dt.Columns)
                    {
                        ICell cell = headerRow.CreateCell(icolIndex);
                        cell.SetCellValue(item.ColumnName);
                        cell.CellStyle = HeadercellStyle; 
                        icolIndex++;
                    }


                    ICellStyle cellStyle = workbook.CreateCellStyle();
                    //为避免日期格式被Excel自动替换,所以设定 format 为 『@』 表示一率当成text来看
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("¥#,##0.00");
                    cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
                    cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
                    cellStyle.VerticalAlignment = VerticalAlignment.Center;
                    cellStyle.Alignment = HorizontalAlignment.Center;
                    NPOI.SS.UserModel.IFont cellfont = workbook.CreateFont();
                    cellfont.Boldweight = (short)FontBoldWeight.Normal; 
                    cellStyle.SetFont(cellfont);
                    if (indexType == 1)
                    {
                        //建立内容行
                        int iRowIndex = 1;
                        int iCellIndex = 0;
                        foreach (DataRow Rowitem in dt.Rows)
                        {
                            IRow DataRow = sheet.CreateRow(iRowIndex);
                            foreach (DataColumn Colitem in dt.Columns)
                            {
                                ICell cell = DataRow.CreateCell(iCellIndex);
                                cell.SetCellValue(Rowitem[Colitem].ToString());
                                cell.CellStyle = cellStyle; 
                                iCellIndex++;
                            }
                            iCellIndex = 0;
                            iRowIndex++;
                        }
                        //自适应列宽
                        for (int i = 0; i < icolIndex; i++)
                        {
                            sheet.AutoSizeColumn(i);
                        }
                    }
                    if (dt.TableName == "工程款统计表")
                    {
                        sheet.ShiftRows(0, sheet.LastRowNum, 1); 
                        var newrow = sheet.CreateRow(0);
                        newrow.CreateCell(1).SetCellValue("工程来款统计"); 
                        var cell1 = sheet.GetRow(0).GetCell(1);
                        cell1.CellStyle = HeadercellStyle; 
                        newrow.CreateCell(11).SetCellValue("内包结算");
                        var cell2 = sheet.GetRow(0).GetCell(11);
                        cell2.CellStyle = HeadercellStyle; 
                        newrow.CreateCell(17).SetCellValue("付款");
                        var cell3 = sheet.GetRow(0).GetCell(17);
                        cell3.CellStyle = HeadercellStyle;
                        newrow.CreateCell(18).SetCellValue("剩余可用资金");
                        var cell4 = sheet.GetRow(0).GetCell(18);
                        cell4.CellStyle = HeadercellStyle;
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 1, 10));//起始行,结束行,起始列,结束列 
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 18, 21));//起始行,结束行,起始列,结束列 
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 11, 16));//起始行,结束行,起始列,结束列 
                    }
                    if (dt.TableName == "项目经理来款和其他来款统计表")
                    {
                        sheet.ShiftRows(0, sheet.LastRowNum, 1);
                        var newrow = sheet.CreateRow(0);
                        newrow.CreateCell(1).SetCellValue("项目经理来款统计");
                        var cell1 = sheet.GetRow(0).GetCell(1);
                        cell1.CellStyle = HeadercellStyle;
                        newrow.CreateCell(7).SetCellValue("其他来款统计");
                        var cell2 = sheet.GetRow(0).GetCell(7);
                        cell2.CellStyle = HeadercellStyle;
                       
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 1, 6));//起始行,结束行,起始列,结束列 
                        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 7, 10));//起始行,结束行,起始列,结束列  
                    }
                }

                //设置导出文件路径
                string path = HttpContext.Current.Server.MapPath("Export/");
                //设置新建文件路径及名称
                //string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
                string savePath = new BaseManage.Attach.UploadFile().getExcelPath() + strExcelFileName + DateTime.Now.ToString("yyyy_MM_dd_HH_mm") + ".xls";

                FileStream file = new FileStream(strExcelFileName, FileMode.OpenOrCreate);
                workbook.Write(file);

                //创建一个 IO 流
                MemoryStream ms = new MemoryStream();
                //写入到流
                workbook.Write(ms);
                //转换为字节数组
                byte[] bytes = ms.ToArray();
                file.Write(bytes, 0, bytes.Length);
                file.Flush();
                //还可以调用下面的方法,把流输出到浏览器下载
                OutputClient(bytes, strExcelFileName);
                //释放资源
                bytes = null;
                ms.Close();
                ms.Dispose();
                file.Close();
                file.Dispose();
                File.Delete(savePath);

                workbook.Close();
                // sheet = null;
                workbook = null;


                file.Flush();
                file.Close();
                BSave = true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return BSave;
        }
        /// <summary>
        /// 流输出到浏览器下载
        /// </summary>
        /// <param name="bytes"></param>
        public static void OutputClient(byte[] bytes, string name)
        {
            HttpResponse response = HttpContext.Current.Response;

            response.Buffer = true;

            response.Clear();
            response.ClearHeaders();
            response.ClearContent();

            response.ContentType = "application/vnd.ms-excel";
            response.AddHeader("Content-Length", bytes.Length.ToString());
            response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", name + DateTime.Now.ToString("yyyyMMddHHmm")));

            response.Charset = "GB2312";
            response.ContentEncoding = Encoding.GetEncoding("GB2312");

            response.BinaryWrite(bytes);
            response.Flush();

            response.Close();
        }

  

posted @ 2022-03-25 10:49  夕阳炒饭的颜色  阅读(154)  评论(0编辑  收藏  举报