NPOI 导出EXCEL(示例)

下面导出excel的方法中有三个表:可分为主表——>副表——>明细表,其中按照CUST_CODE分組主表数据,再进行分组循环副表,再循环副表找出明细表,三个表的数据组成一行填充DataTable的行,每一组主表下组成的Row形成一个DataTable,调用ExportByCMR010CHG2方法,传入List<DataTable> listDT, int[] widths(行宽),代码画Excel的页面

 

#region 获取以及处理数据
string sql = @"SELECT CUST_CODE, INV_NO, INV_AMT, CRNCY_CODE, MASTER_NO, HOUSE_NO, ORGN_CODE, DEST_CODE,QTY,GW,
(SELECT INCO_TERMS FROM AE_AWB WHERE AWB_NO = CM_INVM.HOUSE_NO AND ROWNUM = 1) AS TERMS
FROM CM_INVM WHERE 1=1";

//unionSQL是一个方法(用来拼接条件的单号)参数:sql语句,单号数组,字段名
sql = unionSQL(sql, ids, "INV_NO");
DataSet masterData = DbHelperOra.Query(sql);

//子表

string detailSQL = @"SELECT INV_NO, CHG_CODE, INV_AMT, CRNCY_CODE FROM CM_INVD where 1=1 ";
string awbNoArr = string.Join(",", masterData.Tables[0].AsEnumerable().Select(x => "'" + x.Field<string>("INV_NO") + "'").ToArray());
detailSQL = unionSQL(detailSQL, awbNoArr, "INV_NO");
DataSet detail = DbHelperOra.Query(detailSQL);

//明细表

string detailPOSQL = @"SELECT AWB_BL, PO_NO FROM TX_INVPO where 1=1 ";
string awbNoPOArr = string.Join(",", masterData.Tables[0].AsEnumerable().Select(x => "'" + x.Field<string>("HOUSE_NO") + "'").ToArray());
detailPOSQL = unionSQL(detailPOSQL, awbNoPOArr, "AWB_BL");
DataSet detailPO = DbHelperOra.Query(detailPOSQL);

List<System.Data.DataTable> listdate = new List<System.Data.DataTable>();
//dts按照CUST_CODE分組
var dts = from t in masterData.Tables[0].AsEnumerable()
group t by new { t1 = t["CUST_CODE"] } into m
select new
{
  CUST_CODE = m.Key.t1
};
//循環分組CUST_CODE
foreach (var CUST_CODE in dts)
{
  List<DataRow> listnewdata = new List<DataRow>();
  System.Data.DataTable rowsTable = new DataTable();
  //循環主單查詢出分組主單數據
  foreach (DataRow item in masterData.Tables[0].Select(" CUST_CODE='" + CUST_CODE.CUST_CODE + "'"))
  {
    string str805CY = "", str819CY = "", str855CY = "", str893CY = "", strCustPO = "";
    decimal f805 = 0, f819 = 0, f855 = 0, f893 = 0;

    #region 循環副單查詢出當前主單INV_NO對應的數據
    //循環副單查詢出當前主單INV_NO對應的數據
    foreach (DataRow itemD in detail.Tables[0].Select(" INV_NO='" + item["INV_NO"] + "'"))
    {
      if (itemD != null)
      {
        if (itemD["CHG_CODE"]?.ToString() == "805")
        {
          f805 = Convert.ToDecimal(itemD["INV_AMT"]);
          str805CY = Convert.ToString(itemD["CRNCY_CODE"]);
        }
        if (itemD["CHG_CODE"]?.ToString() == "819")
        {
          f819 = Convert.ToDecimal(itemD["INV_AMT"]);
          str819CY = Convert.ToString(itemD["CRNCY_CODE"]);
        }
        if (itemD["CHG_CODE"]?.ToString() == "855")
        {
          f855 = Convert.ToDecimal(itemD["INV_AMT"]);
          str855CY = Convert.ToString(itemD["CRNCY_CODE"]);
        }
        if (itemD["CHG_CODE"]?.ToString() == "893")
        {
          f893 = Convert.ToDecimal(itemD["INV_AMT"]);
          str893CY = Convert.ToString(itemD["CRNCY_CODE"]);
        }
      }

    }
    var yuyu = item["INV_NO"].ToString();
    #endregion

    //循環明細查詢出當前主單HOUSE_NO對應的數據
    foreach (DataRow itemPO in detailPO.Tables[0].Select(" AWB_BL='" + item["HOUSE_NO"] + "'"))
    {
      if (itemPO != null)
      {
        if (strCustPO != "")
        {
          strCustPO = strCustPO + "|" + itemPO["PO_NO"];
        }
      }
    }

    //DataSet der = new DataSet();
     //der.CreateDataReader();
    var masterD2 = masterData.Tables[0].Clone();
     masterD2.Clear();
     masterD2.ImportRow(item);
     #region newdata
    var newdata = masterD2.AsEnumerable().Select(xx=>new
     {
       TYPE = " ",
       HAWB_NO = item["HOUSE_NO"],
       SHIP_NO = strCustPO,
       TERM = item["TERMS"],
       FROM = item["ORGN_CODE"],
      TO = item["DEST_CODE"],
      MAWB_NO = item["MASTER_NO"],
       INV_NO = item["INV_NO"],
       AMT = item["INV_AMT"],
      CRNCY1 = item["CRNCY_CODE"],
       f805 = f805,
       str805CY = str805CY,
       f819 = f819,
       str819CY = str819CY,
       f855 = f855,
       str855CY = str855CY,
       f893 = f893,
       str893CY = str893CY,
       HC = "",
       CRNCY3 = "",
       DTD = "",
       CRNCY4 = "",
       FUEL = "",
       CRNCY5 = "",
       WAR = "",
       CRNCY6 = "",
       CARTAGE = "",
       CRNCY7 = "",
       EDI = "",
       CRNCY8 = "",
       OTHER = "",
       CRNCY9 = "",
       FREIGHT_TTL = "",
       CRNCY10 = "",
       TAX = "",
       DTD_NOTAX = "",
       CARTON = item["QTY"],
       WEIGHT = item["GW"]
     }).ToList();
    #endregion
     //listnewdata.AddRange(newdata);
    var newTable = DTToJson.ToDataTable(newdata);
    if (rowsTable.Rows.Count < 1)
     {
       rowsTable = DTToJson.ToDataTable(newdata);
       rowsTable.Clear();
     }
     rowsTable.ImportRow(newTable.Rows[0]);
  }
  //一组行
   //System.Data.DataTable MT = DTToJson.ToDataTable(listnewdata);
   rowsTable.TableName = title;
   listdate.Add(rowsTable);

}
List<int> widthlist = new List<int>();
for (var i = 0; i < 38; i++)
{
  widthlist.Add(3000);
}
MemoryStream ms = NPOIHepler.ExportByCMR010CHG2(listdate, widthlist.ToArray());//调用前一个方法
ms.Seek(0, SeekOrigin.Begin);
return File(ms, "application/ms-excel", title + ".xls");

#endregion

public static MemoryStream ExportByCMR010CHG2(List<DataTable> listDT, int[] widths)
{
  //先创建一个流
   MemoryStream ms = new MemoryStream();
  if (listDT != null && listDT.Count != 0)
   {
    try
     {
       //新建一个excel
       HSSFWorkbook workbook = new HSSFWorkbook();
       //excel样式
       HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
       //创建一个sheet
       ISheet sheet = workbook.CreateSheet(listDT[0].TableName);
       //给指定sheet的内容设置每列宽度(index从0开始,width1000相当于excel设置的列宽3.81)
      for (int i = 0; i < widths.Length; i++)
       {
         sheet.SetColumnWidth(i, widths[i]);
       }
      int lisynum = -1;
      foreach (DataTable dt in listDT)
       {
         lisynum++;

         //在sheet里创建行
         NPOI.SS.UserModel.IRow row1 = sheet.CreateRow(lisynum);
         row1.CreateCell(0).SetCellValue("TYPE");
         row1.CreateCell(1).SetCellValue("HAWB NO");
         row1.CreateCell(2).SetCellValue("AWBSHIP NO");
         row1.CreateCell(3).SetCellValue("TERM");
         row1.CreateCell(4).SetCellValue("FROM");
         row1.CreateCell(5).SetCellValue("TO");
         row1.CreateCell(6).SetCellValue("MAWB NO");
         row1.CreateCell(7).SetCellValue("INV#");
         row1.CreateCell(8).SetCellValue("AMT");
         row1.CreateCell(9).SetCellValue("CRNCY");
         row1.CreateCell(10).SetCellValue("805");
         row1.CreateCell(11).SetCellValue("CRNCY");
         row1.CreateCell(12).SetCellValue("819");
         row1.CreateCell(13).SetCellValue("CRNCY");
         row1.CreateCell(14).SetCellValue("855");
         row1.CreateCell(15).SetCellValue("CRNCY");
         row1.CreateCell(16).SetCellValue("893");
         row1.CreateCell(17).SetCellValue("CRNCY");
         row1.CreateCell(18).SetCellValue("HC");
         row1.CreateCell(19).SetCellValue("CRNCY");
         row1.CreateCell(20).SetCellValue("DTD");
         row1.CreateCell(21).SetCellValue("CRNCY");
         row1.CreateCell(22).SetCellValue("FUEL");
         row1.CreateCell(23).SetCellValue("CRNCY");
         row1.CreateCell(24).SetCellValue("WAR");
         row1.CreateCell(25).SetCellValue("CRNCY");
         row1.CreateCell(26).SetCellValue("CARTAGE");
         row1.CreateCell(27).SetCellValue("CRNCY");
         row1.CreateCell(28).SetCellValue("EDI");
         row1.CreateCell(29).SetCellValue("CRNCY");
         row1.CreateCell(30).SetCellValue("OTHER");
         row1.CreateCell(31).SetCellValue("CRNCY");
         row1.CreateCell(32).SetCellValue("FREIGHT TTL");
         row1.CreateCell(33).SetCellValue("CRNCY");
         row1.CreateCell(34).SetCellValue("TAX");
         row1.CreateCell(35).SetCellValue("DTD NOTAX");
         row1.CreateCell(36).SetCellValue("CARTON");
         row1.CreateCell(37).SetCellValue("WEIGHT");

        for (var r = 0; r < dt.Rows.Count; r++)
        {
          var row_r = sheet.CreateRow(r+ lisynum + 1);
          for (int i = 0; i < dt.Columns.Count; i++)
          {
            row_r.CreateCell(i).SetCellValue(dt.Rows[r][i].ToString());
          }
        }
        lisynum = lisynum+dt.Rows.Count;
      }
      //写入流
      workbook.Write(ms);
      ms.Flush();
      return ms;
    }
    catch (Exception ex)
    {
      
    }
  }
  return null;
}

//unionSQL方法(用来拼接条件的单号)

public static string unionSQL(string sql, string ids, string fielId, string OrderBy = "")
{
    //超过1000个CRNO使用union拼接
    StringBuilder sqlStr = new StringBuilder();
    var number = ids.Split(',').Length % 1000 == 0 ? ids.Split(',').Length / 1000 : ids.Split(',').Length / 1000 + 1;
    for (var i = 0; i < number; i++)
    {
        sqlStr.Append(number > 1 ? " select * from (" : "");
        string[] noArr = ids.Split(',').Skip(1000 * i).Take(1000).ToArray();
        sqlStr.Append(sql + " AND " + fielId + " IN (" + string.Join(",", noArr, 0, noArr.Length) + ")");
        sqlStr.Append(OrderBy);
        sqlStr.Append(number > 1 ? ")" : "");
        if (i != number - 1)
        {
            sqlStr.Append(Environment.NewLine + "union" + Environment.NewLine);
        }
    }
    return sqlStr.ToString();
}

 

posted @ 2019-10-22 16:09  官方小可爱  阅读(838)  评论(0)    收藏  举报