using System.IO;
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using NPOI.XSSF.UserModel;
using System;
using UAS_LabelMachine.Entity;
using UAS_LabelMachine.PublicMethod;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace UAS_LabelMachine
{
    class ExcelHandler
    {
        DataHelper dh = SystemInf.dh;

        /// <summary>
        /// 导出Excel,返回文件在客户端的路径
        /// </summary>
        public string ExportExcel(DataTable dt, string FolderPath, string FileName)
        {
            //创建一个内存流,用来接收转换成Excel的内容
            MemoryStream ms;
            ms = DataTableToExcel(dt);
            //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
            string filePath = @FolderPath + "\\" + FileName + ".xls";
            FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
            byte[] data = ms.ToArray();
            fs.Write(data, 0, data.Length);
            fs.Flush();
            //释放当前Excel文件,否则打开文件的时候会显示文件被占用
            ms.Dispose();
            fs.Dispose();
            return filePath;
        }

        /// <summary>
        /// 导出Excel,返回文件在客户端的路径
        /// </summary>
        public string ExportExcel(DataTable firstsdt, DataTable dt, string FolderPath, string FileName, string Type, int PageSize, List<CheckBox> conditionbox)
        {
            //创建一个内存流,用来接收转换成Excel的内容
            MemoryStream ms;
            ms = DataTableToExcel1(firstsdt, dt, Type, FileName, PageSize, conditionbox);
            //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
            string filePath = @FolderPath + "\\" + FileName + ".xls";
            FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
            byte[] data = ms.ToArray();
            fs.Write(data, 0, data.Length);
            fs.Flush();
            //释放当前Excel文件,否则打开文件的时候会显示文件被占用
            ms.Dispose();
            fs.Dispose();
            return filePath;
        }

        /// <summary>
        /// 导入Excel
        /// </summary>
        public void ImportExcel(DataTable DataTable, string TableName)
        {
            int columnNum = DataTable.Columns.Count;
            int rowNum = DataTable.Columns.Count;
            string[] field = new string[columnNum];
            for (int i = 0; i < columnNum; i++)
            {
                field[i] = DataTable.Rows[0][i].ToString();
            }
        }

        public static DataTable ExcelToDataTable(string filePath, bool isColumnName)
        {
            DataTable dataTable = null;
            FileStream fs = null;
            DataColumn column = null;
            DataRow dataRow = null;
            IWorkbook workbook = null;
            ISheet sheet = null;
            IRow row = null;
            ICell cell = null;
            int startRow = 0;
            try
            {
                using (fs = File.OpenRead(filePath))
                {
                    // 2007版本
                    if (filePath.IndexOf(".xlsx") > 0)
                    {
                        workbook = new XSSFWorkbook(fs);
                    }
                    // 2003版本
                    else if (filePath.IndexOf(".xls") > 0)
                    {
                        workbook = new HSSFWorkbook(fs);
                    }
                    if (workbook != null)
                    {
                        sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet
                        dataTable = new DataTable();
                        if (sheet != null)
                        {
                            int rowCount = sheet.LastRowNum;//总行数
                            if (rowCount > 0)
                            {
                                IRow firstRow = sheet.GetRow(0);//第一行
                                int cellCount = firstRow.LastCellNum;//列数

                                //构建datatable的列
                                if (isColumnName)
                                {
                                    startRow = 1;//如果第一行是列名,则从第二行开始读取
                                    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                    {
                                        cell = firstRow.GetCell(i);
                                        if (cell != null)
                                        {
                                            if (cell.StringCellValue != null)
                                            {
                                                column = new DataColumn(cell.StringCellValue);
                                                dataTable.Columns.Add(column);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                    {
                                        column = new DataColumn("column" + (i + 1));
                                        dataTable.Columns.Add(column);
                                    }
                                }
                                //填充行
                                for (int i = startRow; i <= rowCount; ++i)
                                {
                                    row = sheet.GetRow(i);
                                    if (row == null) continue;

                                    dataRow = dataTable.NewRow();
                                    for (int j = row.FirstCellNum; j < cellCount; ++j)
                                    {
                                        cell = row.GetCell(j);
                                        if (cell == null)
                                        {
                                            dataRow[j] = "";
                                        }
                                        else
                                        {
                                            //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
                                            switch (cell.CellType)
                                            {
                                                case CellType.Blank:
                                                    dataRow[j] = "";
                                                    break;
                                                case CellType.Numeric:
                                                    short format = cell.CellStyle.DataFormat;
                                                    //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
                                                    if (format == 14 || format == 31 || format == 57 || format == 58)
                                                        dataRow[j] = cell.DateCellValue;
                                                    else
                                                        dataRow[j] = cell.NumericCellValue;
                                                    break;
                                                case CellType.String:
                                                    dataRow[j] = cell.StringCellValue;
                                                    break;
                                            }
                                        }
                                    }
                                    dataTable.Rows.Add(dataRow);
                                }
                            }
                        }
                    }
                }
                return dataTable;
            }
            catch (Exception)
            {
                if (fs != null)
                {
                    fs.Close();
                }
                return null;
            }
        }
        int RowHeight = 11;
        /// <summary>
        /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
        /// </summary>
        /// <param name="DataTable"></param>
        /// <returns></returns>
        public MemoryStream DataTableToExcel(DataTable DataTable)
        {
            //创建内存流
            MemoryStream ms = new MemoryStream();
            //创建一个Book,相当于一个Excel文件
            HSSFWorkbook book = new HSSFWorkbook();
            //Excel中的Sheet
            ISheet sheet = book.CreateSheet("sheet1");
            //获取行数量和列数量
            int rowNum = DataTable.Rows.Count;
            int columnNum = DataTable.Columns.Count;
            //设置列的宽度,根据首行的列的内容的长度来设置
            for (int i = 0; i < columnNum; i++)
            {
                int dataLength;
                //如果内容比标题短则取标题长度
                if (DataTable.Rows[0][i].ToString().Length < DataTable.Columns[i].ColumnName.Length)
                {
                    dataLength = DataTable.Columns[i].ColumnName.Length;
                    dataLength = dataLength * 300;
                }
                else
                {
                    dataLength = DataTable.Rows[0][i].ToString().Length;
                    dataLength = dataLength * 300;
                }
                sheet.SetColumnWidth(i, dataLength);
            }
            //首先画好第一行带颜色的,单独写出来,避免写在循环里面
            IRow row = sheet.CreateRow(0);
            //冻结第一行
            sheet.CreateFreezePane(0, 1, 0, 1);
            ICellStyle style = book.CreateCellStyle();
            style.FillForegroundColor = HSSFColor.PaleBlue.Index;
            style.FillPattern = FillPattern.BigSpots;
            style.FillBackgroundColor = HSSFColor.LightGreen.Index;
            //设置边框
            style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
            style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            row.HeightInPoints = 20;
            //固定第一行
            //row.RowStyle.IsLocked=true;
            //给第一行的标签赋值样式和值
            for (int j = 0; j < columnNum; j++)
            {
                row.CreateCell(j);
                row.Cells[j].CellStyle = style;
                row.Cells[j].CellStyle.VerticalAlignment = VerticalAlignment.Center;
                row.Cells[j].CellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                row.Cells[j].SetCellValue(DataTable.Columns[j].Caption);
            }
            //将DataTable的值循环赋值给book,Aligment设置居中
            //之前已经画了带颜色的第一行,所以从i=1开始画
            for (int i = 0; i < rowNum; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                row1.HeightInPoints = 20;
                for (int j = 0; j < columnNum; j++)
                {
                    row1.CreateCell(j);
                    row1.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString());
                    row1.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.Center;
                }
            }
            //将book的内容写入内存流中返回
            book.Write(ms);
            return ms;
        }

        /// <summary>
        /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
        /// </summary>
        /// <param name="DataTable"></param>
        /// <returns></returns>
        public MemoryStream DataTableToExcel1(DataTable FirstDT, DataTable DataTable, string Type,string Inoutno, int PageSize, List<CheckBox> conditionbox)
        {
            //转换为序列
            CheckBox[] box = conditionbox.ToArray();
            //创建内存流
            MemoryStream ms = new MemoryStream();
            //创建一个Book,相当于一个Excel文件
            HSSFWorkbook book = new HSSFWorkbook();
            //Excel中的Sheet
            ISheet sheet = book.CreateSheet("分页");

            //更新箱号
            List<string> ch_code = new List<string>();
            //系统打印箱号
            List<string> pib_outboxcode1 = new List<string>();

            int BoxCode = 1;
            ICellStyle style = book.CreateCellStyle();
            style.VerticalAlignment = VerticalAlignment.Center;
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;

            ICellStyle styleborder = book.CreateCellStyle();
            styleborder.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
            styleborder.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            styleborder.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            styleborder.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            styleborder.VerticalAlignment = VerticalAlignment.Center;
            styleborder.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
            string pi_inoutno = "";
            //设置列的宽度,根据首行的列的内容的长度来设置
            for (int i = DataTable.Columns.Count - 1; i > 0; i--)
            {
                for (int j = 0; j < box.Length; j++)
                {
                    if (box[j].Name.ToLower() == "ch_bluefilm" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_bluefilm"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ch_code" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_code"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ch_splitbatch" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_splitbatch"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ch_waterid" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_waterid"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ch_pbcode" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_pbcode"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ch_remark" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("ch_remark"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "percent" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower().Contains("chw_percent1") || DataTable.Columns[i].ColumnName.ToLower().Contains("chw_percent2") || DataTable.Columns[i].ColumnName.ToLower().Contains("chw_itemname1") || DataTable.Columns[i].ColumnName.ToLower().Contains("chw_itemname2"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "ts" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower() == ("ts1") || DataTable.Columns[i].ColumnName.ToLower() == ("ts2") || DataTable.Columns[i].ColumnName.ToLower() == ("ts3"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                    if (box[j].Name.ToLower() == "bvceo" && !box[j].Checked)
                    {
                        if (DataTable.Columns[i].ColumnName.ToLower() == "bvceo1" || DataTable.Columns[i].ColumnName.ToLower() == ("bvceo2") || DataTable.Columns[i].ColumnName.ToLower() == ("bvceo3"))
                        {
                            DataTable.Columns.RemoveAt(i);
                            break;
                        }
                    }
                }
            }
            //获取行数量和列数量
            int rowNum = DataTable.Rows.Count;
            int columnNum = DataTable.Columns.Count;
            //首先画好第一行带颜色的,单独写出来,避免写在循环里面
            IRow row = sheet.CreateRow(0);
            //冻结第一行
            sheet.CreateFreezePane(0, 1, 0, 1);
   
            row.HeightInPoints = RowHeight;
            //固定第一行
            //row.RowStyle.IsLocked=true;
            //给第一行的标签赋值样式和值
            row.CreateCell(0);
            row.Cells[0].SetCellValue("                     深爱半导体有限公司芯片出货清单");
            row.GetCell(0).CellStyle = style;
            //开始绘制的Index
            int PaintIndex = 1;
            int sumCount = 0;
            int totalCount = 0;
            switch (Type)
            {
                case "FixRow":
                    //清理系统取出来的数据
                    BaseUtil.CleanDataTableData(FirstDT);
                    //首页参数拼接
                    string First_OrderCode = "";
                    string First_Prspec = "";
                    string First_Batch = "";
                    ArrayList<string> First_WID = new ArrayList<string>();
                    for (int i = 0; i < rowNum; i++)
                    {
                        IRow row1 = sheet.CreateRow(PaintIndex);
                        PaintIndex = PaintIndex + 1;
                        row1.HeightInPoints = RowHeight;
                        //不包含的订单号
                        if (DataTable.Columns.Contains("pd_ordercode") && !First_OrderCode.Contains(DataTable.Rows[i]["pd_ordercode"].ToString()))
                        {
                            First_OrderCode += DataTable.Rows[i]["pd_ordercode"].ToString() + " ";
                        }
                        //不包含的物料型号
                        if (DataTable.Columns.Contains("pr_spec1") && !First_Prspec.Contains(DataTable.Rows[i]["pr_spec1"].ToString()))
                        {
                            First_Prspec += DataTable.Rows[i]["pr_spec1"].ToString() + " ";
                        }
                        //不包含扩撒批号
                        if (DataTable.Columns.Contains("ch_splitbatch") && !First_Batch.Contains(DataTable.Rows[i]["ch_splitbatch"].ToString()))
                        {
                            First_Batch += DataTable.Rows[i]["ch_splitbatch"].ToString() + " ";
                        }
                        //不包含Wafer_id
                        if (DataTable.Columns.Contains("Wafer_ID") && !First_WID.Contains(DataTable.Rows[i]["Wafer_ID"].ToString()))
                        {
                            First_WID.Add(DataTable.Rows[i]["Wafer_ID"].ToString());
                        }
                        if (i / PageSize >= 1 && i % PageSize == 0)
                        {
                            DataRow dr = FirstDT.NewRow();
                            dr["pr_spec"] = DataTable.Rows[i]["pr_spec"].ToString();
                            dr["pi_inoutno"] = DataTable.Rows[i]["pi_inoutno"].ToString();
                            pi_inoutno = DataTable.Rows[i]["pi_inoutno"].ToString();
                            dr["pi_title"] = DataTable.Rows[i]["pi_title"].ToString();
                            dr["pi_date"] = DataTable.Rows[i]["pi_date"].ToString();
                            dr["pd_ordercode"] = First_OrderCode;
                            dr["pr_spec1"] = First_Prspec;
                            dr["ch_splitbatch"] = First_Batch;
                            dr["ch_waterid"] = BaseUtil.GetArrStr(First_WID, " ");
                            dr["num"] = PageSize;
                            dr["io_qty"] = sumCount;
                            FirstDT.Rows.Add(dr);
                            First_OrderCode = "";
                            First_Prspec = "";
                            First_Batch = "";
                            First_WID.Clear();
                            BoxCode = BoxCode + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            sumCount = 0;
                            row1 = sheet.CreateRow(PaintIndex);
                            sheet.SetRowBreak(PaintIndex-1);
                            PaintIndex = PaintIndex + 1;
                        }
                        //每次到了页数开始分页
                        if (i % PageSize == 0 || i == rowNum - 1)
                        {
                            //第一行添加客户信息   rownum只有一行的情
                            if (i != rowNum - 1 || rowNum == 1)
                            {
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_title"].ToString());
                                    }
                                    else if (j > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                                    }
                                    else if (columnNum > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                //第二行添加型号
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pr_spec"].ToString());
                                    }
                                    else if (columnNum > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                                    }
                                    else if (columnNum <= 5 && j == columnNum - 4)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                //添加列名
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                for (int j = 4; j < columnNum; j++)
                                {
                                    row1.CreateCell(j - 4);
                                    row1.Cells[j - 4].CellStyle = styleborder;
                                    if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent1")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname1"].ToString());
                                    }
                                    else if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent2")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname2"].ToString());
                                    }
                                    else
                                        row1.Cells[j - 4].SetCellValue(DataTable.Columns[j].Caption);
                                    //如果chw_itemname1的值为空,则值为100和0,其中一列不显示,不显示
                                    if (DataTable.Columns[j].ColumnName.ToLower().Contains("chw_itemname") || DataTable.Columns[j].ColumnName.ToLower().Contains("pr_spec") || DataTable.Columns[j].ColumnName.ToLower().Contains("pd_ordercode"))
                                    {
                                        sheet.SetColumnHidden(j - 4, true);
                                    }
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                            }
                        }
                        //添加数据内容
                        for (int j = 4; j < columnNum; j++)
                        {
                            string Data = DataTable.Rows[i][j].ToString();
                            row1.CreateCell(j - 4);
                            row1.Cells[j - 4].SetCellValue(Data);
                            row1.GetCell(j - 4).CellStyle = styleborder;
                            if (DataTable.Columns[j].ColumnName == "io_qty")
                            {
                                sumCount += int.Parse(DataTable.Rows[i][j].ToString());
                                totalCount += int.Parse(DataTable.Rows[i][j].ToString());
                            }
                            if (DataTable.Columns[j].ColumnName == "rownum")
                            {
                                row1.Cells[j - 4].SetCellValue(i + 1);
                            }
                        }
                        //固定行号分组的时候自动拼接新的DataTable
                        if (i == rowNum - 1)
                        {
                            DataRow dr = FirstDT.NewRow();
                            dr["pr_spec"] = DataTable.Rows[i]["pr_spec"].ToString();
                            dr["pi_inoutno"] = DataTable.Rows[i]["pi_inoutno"].ToString();
                            dr["pi_title"] = DataTable.Rows[i]["pi_title"].ToString();
                            dr["pi_date"] = DataTable.Rows[i]["pi_date"].ToString();
                            dr["pd_ordercode"] = First_OrderCode;
                            dr["pr_spec1"] = First_Prspec;
                            dr["ch_splitbatch"] = First_Batch;
                            dr["ch_waterid"] = BaseUtil.GetArrStr(First_WID, " ");
                            dr["num"] = (i % PageSize) + 1;
                            dr["io_qty"] = sumCount;
                            FirstDT.Rows.Add(dr);
                            row1 = sheet.CreateRow(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            row1 = sheet.CreateRow(PaintIndex);
                            for (int j = 0; j < columnNum - 3; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("备注");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(totalCount);
                                }
                                //原本是j == columnNum - 5因为还有spec和order两列隐藏列,所以需要在往后移动
                                else if (j == columnNum - 6)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(rowNum);
                                }
                                else if (j > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else if (columnNum > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = style;
                            }
                            sheet.SetRowBreak(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                        }
                        ch_code.Add(DataTable.Rows[i]["ch_code"].ToString());
                        pib_outboxcode1.Add(BoxCode.ToString());
                    }
                    for (int i = 0; i < sheet.LastRowNum; i++)
                    {
                        if (i != 0)
                        {
                            sheet.AutoSizeColumn(i);
                            sheet.SetColumnWidth(i, sheet.GetColumnWidth(i) + 1000);
                        }
                    }
                    break;
                case "BatchCode":
                    string LastBatchCode = "";
                    for (int i = 0; i < rowNum; i++)
                    {
                        IRow row1 = sheet.CreateRow(PaintIndex);
                        PaintIndex = PaintIndex + 1;
                        row1.HeightInPoints = RowHeight;
                        //如果批号不相等的时候
                        if (LastBatchCode != "" && LastBatchCode != DataTable.Rows[i]["ch_splitbatch"].ToString())
                        {
                            BoxCode = BoxCode + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            sumCount = 0;
                            row1 = sheet.CreateRow(PaintIndex);
                            sheet.SetRowBreak(PaintIndex - 1);
                            PaintIndex = PaintIndex + 1;
                        }
                        //每次到了页数开始分页
                        if (LastBatchCode == "" || (LastBatchCode != "" && LastBatchCode != DataTable.Rows[i]["ch_splitbatch"].ToString()) || i == rowNum - 1)
                        {
                            LastBatchCode = DataTable.Rows[i]["ch_splitbatch"].ToString();
                            //第一行添加客户信息
                            if (i != rowNum - 1)
                            {
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_title"].ToString());
                                    }
                                    else if (j == columnNum - 4)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                //第二行添加型号
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pr_spec"].ToString());
                                    }
                                    else if (j == columnNum - 4)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                //添加列名
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                for (int j = 4; j < columnNum; j++)
                                {
                                    row1.CreateCell(j - 4);
                                    row1.Cells[j - 4].CellStyle = styleborder;
                                    if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent1")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname1"].ToString());
                                    }
                                    else if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent2")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname2"].ToString());
                                    }
                                    else
                                        row1.Cells[j - 4].SetCellValue(DataTable.Columns[j].Caption);
                                    if (DataTable.Columns[j].ColumnName.ToLower().Contains("chw_itemname") || DataTable.Columns[j].ColumnName.ToLower().Contains("pr_spec") || DataTable.Columns[j].ColumnName.ToLower().Contains("pd_ordercode"))
                                    {
                                        sheet.SetColumnHidden(j - 4, true);
                                    }
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                            }
                        }
                        //添加数据内容
                        for (int j = 4; j < columnNum; j++)
                        {
                            string Data = DataTable.Rows[i][j].ToString();
                            row1.CreateCell(j - 4);
                            row1.Cells[j - 4].SetCellValue(Data);
                            row1.GetCell(j - 4).CellStyle = styleborder;
                            if (DataTable.Columns[j].ColumnName == "io_qty")
                            {
                                sumCount += int.Parse(DataTable.Rows[i][j].ToString());
                                totalCount += int.Parse(DataTable.Rows[i][j].ToString());
                            }
                            if (DataTable.Columns[j].ColumnName == "rownum")
                            {
                                row1.Cells[j - 4].SetCellValue(i + 1);
                            }
                        }
                        if (i == rowNum - 1)
                        {
                            row1 = sheet.CreateRow(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            //创建备注内容
                            row1 = sheet.CreateRow(PaintIndex);
                            for (int j = 0; j < columnNum - 3; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("备注");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(totalCount);
                                }
                                else if (j == columnNum - 6)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(rowNum);
                                }
                                else if (j > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else if (columnNum > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = style;
                            }
                            sheet.SetRowBreak(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                        }
                        ch_code.Add(DataTable.Rows[i]["ch_code"].ToString());
                        pib_outboxcode1.Add(BoxCode.ToString());
                    }
                    for (int i = 0; i < sheet.LastRowNum; i++)
                    {
                        if (i != 0)
                        {
                            sheet.AutoSizeColumn(i);
                            sheet.SetColumnWidth(i, sheet.GetColumnWidth(i) + 1000);
                        }
                    }
                    break;
                case "BoxCode":
                    string LastBoxCode = "";
                    for (int i = 0; i < rowNum; i++)
                    {
                        IRow row1 = sheet.CreateRow(PaintIndex);
                        PaintIndex = PaintIndex + 1;
                        row1.HeightInPoints = RowHeight;
                        //如果批号不相等的时候
                        if (LastBoxCode != "" && LastBoxCode != DataTable.Rows[i]["CH_PBCODE"].ToString())
                        {
                            BoxCode = BoxCode + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            sumCount = 0;
                            row1 = sheet.CreateRow(PaintIndex);
                            sheet.SetRowBreak(PaintIndex - 1);
                            PaintIndex = PaintIndex + 1;
                        }
                        //每次到了页数开始分页
                        if (LastBoxCode == "" || (LastBoxCode != "" && LastBoxCode != DataTable.Rows[i]["ch_pbcode"].ToString()) || i == rowNum - 1)
                        {
                            LastBoxCode = DataTable.Rows[i]["CH_PBCODE"].ToString();
                            //第一行添加客户信息
                            if (i != rowNum - 1)
                            {
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_title"].ToString());
                                    }
                                    else if (j > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                                    }
                                    else if (columnNum > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                //第二行添加型号
                                for (int j = 0; j < columnNum - 3; j++)
                                {
                                    if (j == 0)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pr_spec"].ToString());
                                    }
                                    else if (j > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                                    }
                                    else if (columnNum > 5 && j == columnNum - 5)
                                    {
                                        row1.CreateCell(j);
                                        row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                                    }
                                    else
                                    {
                                        row1.CreateCell(j);
                                    }
                                    row1.GetCell(j).CellStyle = style;
                                }
                                //添加列名
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                                for (int j = 4; j < columnNum; j++)
                                {
                                    //设定固定的列名
                                    row1.CreateCell(j - 4);
                                    row1.Cells[j - 4].CellStyle = styleborder;
                                    if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent1")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname1"].ToString());
                                    }
                                    else if (DataTable.Columns[j].ColumnName.ToLower() == "chw_percent2")
                                    {
                                        row1.Cells[j - 4].SetCellValue(DataTable.Rows[i]["chw_itemname2"].ToString());
                                    }
                                    else
                                        row1.Cells[j - 4].SetCellValue(DataTable.Columns[j].Caption);
                                    if (DataTable.Columns[j].ColumnName.ToLower().Contains("chw_itemname") || DataTable.Columns[j].ColumnName.ToLower().Contains("pr_spec") || DataTable.Columns[j].ColumnName.ToLower().Contains("pd_ordercode"))
                                    {
                                        sheet.SetColumnHidden(j - 4, true);
                                    }
                                }
                                row1 = sheet.CreateRow(PaintIndex);
                                PaintIndex = PaintIndex + 1;
                            }
                        }
                        //添加数据内容
                        for (int j = 4; j < columnNum; j++)
                        {
                            string Data = DataTable.Rows[i][j].ToString();
                            row1.CreateCell(j - 4);
                            row1.Cells[j - 4].SetCellValue(Data);
                            row1.GetCell(j - 4).CellStyle = styleborder;
                            if (DataTable.Columns[j].ColumnName == "io_qty")
                            {
                                sumCount += int.Parse(DataTable.Rows[i][j].ToString());
                                totalCount += int.Parse(DataTable.Rows[i][j].ToString());
                            }
                            if (DataTable.Columns[j].ColumnName == "rownum")
                            {
                                row1.Cells[j - 4].SetCellValue(i + 1);
                            }
                        }
                        if (i == rowNum - 1)
                        {
                            row1 = sheet.CreateRow(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                            for (int j = 0; j < columnNum - 4; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("小计");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(sumCount);
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = styleborder;
                            }
                            row1 = sheet.CreateRow(PaintIndex);
                   
                            for (int j = 0; j < columnNum - 3; j++)
                            {
                                if (j == 0)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("备注");
                                }
                                else if (j == 2)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(totalCount);
                                }
                                else if (j == columnNum - 6)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue(rowNum);
                                }
                                else if (j > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else if (columnNum > 5 && j == columnNum - 5)
                                {
                                    row1.CreateCell(j);
                                    row1.Cells[j].SetCellValue("片");
                                }
                                else
                                {
                                    row1.CreateCell(j);
                                }
                                row1.Cells[j].CellStyle = style;
                            }
                            sheet.SetRowBreak(PaintIndex);
                            PaintIndex = PaintIndex + 1;
                        }
                        ch_code.Add(DataTable.Rows[i]["ch_code"].ToString());
                        pib_outboxcode1.Add(BoxCode.ToString());
                    }
                    for (int i = 0; i < sheet.LastRowNum; i++)
                    {
                        if (i != 0)
                        {
                            sheet.AutoSizeColumn(i);
                            sheet.SetColumnWidth(i, sheet.GetColumnWidth(i) + 1000);
                        }
                    }
                    break;
                default:
                    break;
            }
            dh.BatchInsert("update prodiobarcode set pib_outboxcode1=:pib_outboxcode1 where pib_inoutno='"+ Inoutno + "' and pib_custbarcode=:pib_custbarcode",new string[] { "pib_outboxcode1", "pib_custbarcode" },pib_outboxcode1.ToArray(), ch_code.ToArray());
            //填充首页
            sumCount = 0;
            totalCount = 0;
            PaintIndex = 1;
            ISheet sheet2 = book.CreateSheet("首页");
            row = sheet2.CreateRow(0);
            row.CreateCell(0);
            row.Cells[0].SetCellValue("                     深爱半导体有限公司芯片出货清单");
            row.GetCell(0).CellStyle = style;
            rowNum = FirstDT.Rows.Count;
            //不需要显示的列移除
            for (int i = FirstDT.Columns.Count - 1; i > 0; i--)
            {
                for (int j = 0; j < box.Length; j++)
                {
                    if (box[j].Name == "FirstPage_WID" && !box[j].Checked)
                    {
                        if (FirstDT.Columns[i].ColumnName.ToLower().Contains("ch_waterid"))
                        {
                            FirstDT.Columns.RemoveAt(i);
                        }
                    }
                    if (box[j].Name == "FirstPage_YIELD" && !box[j].Checked)
                    {
                        if (FirstDT.Columns[i].ColumnName.ToLower().Contains("ch_yeild"))
                        {
                            FirstDT.Columns.RemoveAt(i);
                        }
                    }
                    if (box[j].Name == "FirstPage_REMARK" && !box[j].Checked)
                    {
                        if (FirstDT.Columns[i].ColumnName.ToLower().Contains("ch_remark"))
                        {
                            FirstDT.Columns.RemoveAt(i);
                        }
                    }
                }
            }
            columnNum = FirstDT.Columns.Count;
            for (int i = 0; i < rowNum; i++)
            {
                IRow row1 = sheet2.CreateRow(PaintIndex);
                PaintIndex = PaintIndex + 1;
                row1.HeightInPoints = RowHeight;
                //只需要绘制一行
                if (i == 0)
                {
                    for (int j = 0; j < columnNum - 3; j++)
                    {
                        if (j == 0)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(FirstDT.Rows[i]["pi_title"].ToString());
                        }
                        else if (j > 5 && j == columnNum - 5)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                        }
                        else if (columnNum > 5 && j == columnNum - 5)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_inoutno"].ToString());
                        }
                        else
                        {
                            row1.CreateCell(j);
                        }
                        row1.GetCell(j).CellStyle = style;
                    }
                    row1 = sheet2.CreateRow(PaintIndex);
                    PaintIndex = PaintIndex + 1;
                    //第二行添加型号
                    for (int j = 0; j < columnNum - 3; j++)
                    {
                        if (j == 0)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(FirstDT.Rows[i]["pr_spec"].ToString());
                        }
                        else if (j > 5 && j == columnNum - 5)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                        }
                        else if (columnNum > 5 && j == columnNum - 5)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].SetCellValue(DataTable.Rows[i]["pi_date"].ToString());
                        }
                        else
                        {
                            row1.CreateCell(j);
                        }
                        row1.GetCell(j).CellStyle = style;
                    }
                    row1 = sheet2.CreateRow(PaintIndex);
                    PaintIndex = PaintIndex + 1;
                    //添加列名
                    for (int j = 4; j < columnNum; j++)
                    {
                        row1.CreateCell(j - 4);
                        row1.Cells[j - 4].CellStyle = styleborder;
                        row1.Cells[j - 4].SetCellValue(FirstDT.Columns[j].Caption);
                    }
                    row1 = sheet2.CreateRow(PaintIndex);
                    PaintIndex = PaintIndex + 1;
                }
                //添加数据内容
                for (int j = 4; j < columnNum; j++)
                {
                    string Data = FirstDT.Rows[i][j].ToString();
                    row1.CreateCell(j - 4);
                    row1.Cells[j - 4].SetCellValue(Data);
                    row1.GetCell(j - 4).CellStyle = styleborder;
                    if (FirstDT.Columns[j].ColumnName == "num")
                    {
                        sumCount += int.Parse(Data);
                    }
                    if (FirstDT.Columns[j].ColumnName == "io_qty")
                    {
                        totalCount += int.Parse(Data);
                    }
                }
                //添加总计行
                if (i == rowNum - 1)
                {
                    row1 = sheet2.CreateRow(PaintIndex);
                    PaintIndex = PaintIndex + 1;
                    for (int j = 0; j < columnNum - 4; j++)
                    {
                        if (j == 0)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].CellStyle = styleborder;
                            row1.Cells[j].SetCellValue("总计");
                        }
                        else if (j == columnNum - 6)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].CellStyle = styleborder;
                            row1.Cells[j].SetCellValue(sumCount);
                        }
                        else if (j == columnNum - 5)
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].CellStyle = styleborder;
                            row1.Cells[j].SetCellValue(totalCount);
                        }
                        else
                        {
                            row1.CreateCell(j);
                            row1.Cells[j].CellStyle = styleborder;
                        }
                    }
                }
            }
            for (int i = 0; i < sheet2.LastRowNum; i++)
            {
                if (i != 0)
                {
                    sheet2.AutoSizeColumn(i);
                    sheet2.SetColumnWidth(i, sheet2.GetColumnWidth(i) + 1000);
                }
            }
            //将book的内容写入内存流中返回
            book.Write(ms);
            return ms;
        }
    }
}