2020-08-09

数据的导出
*数据的导出—>我们的数据是表格形式
*Excel —> 电子表格
一.数据导出的操作
*数据导出其实是利用了浏览器的下载功能,把下载的连接在新窗口打开
Window.open — 在新窗口打开
打开新窗口的连接
window.open(’@Url.Content(“http://WWW.baidu。Com”)
回到控制器写导出页面
①查询出要导出的数据
查询出需要导出的数据
var query = from tabPNRPassenger in myModel.B_PNRPassenger
join tbPassengerType in myModel.S_PassengerType
on tabPNRPassenger.passengerTypeID equals tbPassengerType.passengerTypeID
join tbCertificatesType in myModel.S_CertificatesType
on tabPNRPassenger.certificatesTypeID equals tbCertificatesType.certificatesTypeID
join tbPNR in myModel.B_PNR
on tabPNRPassenger.PNRID equals tbPNR.PNRID
orderby tabPNRPassenger.PNRPassengerID
select new PassengerVo()
{
passengerName = tabPNRPassenger.passengerName,
passengerType = tbPassengerType.passengerType,
certificatesType = tbCertificatesType.certificatesType,
certificatesCode = tabPNRPassenger.certificatesCode,
contactName = tbPNR.contactName,
contactPhone = tbPNR.contactPhone,
createTime = tbPNR.createTime.Value,
};
//判断是否选择时间段
if (!string.IsNullOrEmpty(startEndDate))
{
startEndDate = startEndDate.Replace(" - ", “~”);
string[] strs = startEndDate.Split(’~’);//根据 " - "分割字符串
if (strs.Length == 2)
{
DateTime dtStart = Convert.ToDateTime(strs[0]);
DateTime dtEnd = Convert.ToDateTime(strs[1]);
dtEnd = dtEnd.AddDays(1);
query = query.Where(o => o.createTime >= dtStart && o.createTime < dtEnd);
}
}

            List<PassengerVo> list = query.ToList();

②添加引用
导出需要用到NPOI,必须要把NPOI引入到MVC
③导出步骤
1—创建工作簿
*需要创建一个工作簿(工作簿:创建好的工作簿就是一块空白的模板)

NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
–创建工作表(代码不会自动创建工作簿)-修改工作表的名字
//NPOI.SS.UserModel.ISheet sheet1 = workbook.CreateSheet("***");
NPOI.SS.UserModel.ISheet sheet1 = workbook.CreateSheet();
workbook.SetSheetName(0, “***”);//修改工作表名称
3—设计表标题
3-1、创建行
NPOI.SS.UserModel.IRow rowTitle = sheet1.CreateRow(0);//下标 从零开始的
rowTitle.HeightInPoints = 35;
//行高 HeightInPoints的单位是点,而Height的单位是1/20个点,所以Height的值永远是HeightInPoints的20倍
3-2、创建单元格(从行里面创建单元格)
NPOI.SS.UserModel.ICell cell0 = rowTitle.CreateCell(0);
3-3、设置单元格的值
string strTitle = “旅客数据”;//字符串格式
if (!string.IsNullOrEmpty(startEndDate))
{
strTitle += " " + startEndDate;
}
cell0.SetCellValue(strTitle);
3-4、合并单元格(第几行开始,到第几行结束,第几课列开始,到第几列结束)
把表标题那一行的单元格合并(红色里面的表格合并)
sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 6));

3-5、设置表标题单元格样式
3.5.1、设置表标题里的文字水平居中,垂直居中
NPOI.SS.UserModel.ICellStyle cellStyle_Title = workbook.CreateCellStyle();
cellStyle_Title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
cellStyle_Title.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
3.5.2、声明使用的字体,设计字体的颜色,字体加粗,字体大小
NPOI.SS.UserModel.IFont font_title = workbook.CreateFont();//声明字体
font_title.Color = NPOI.HSSF.Util.HSSFColor.Blue.Index;//设置字体颜色
font_title.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;//加粗
font_title.FontHeightInPoints = 18;//字体大小
3.5.3、设置单元格字体,设置单元格样式
cellStyle_Title.SetFont(font_title);//设置单元格字体
cell0.CellStyle = cellStyle_Title;//设置单元格样式
4、设置表头

4.1-创建一行 索引 1
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(1);//给sheet添加第一行的头部标题
row1.Height = 22 * 20;//设置行高

4.2-创建单元格 并设置值

row1.CreateCell(0).SetCellValue("序号");
row1.CreateCell(1).SetCellValue("旅客姓名");
row1.CreateCell(2).SetCellValue("旅客类型");
row1.CreateCell(3).SetCellValue("证件类型");
row1.CreateCell(4).SetCellValue("证件号码");
row1.CreateCell(5).SetCellValue("联系人姓名");
row1.CreateCell(6).SetCellValue("联系人电话");

4.3-创建表头的样式,文字水平居中,垂直居中
NPOI.SS.UserModel.ICellStyle cellStyle_header = workbook.CreateCellStyle();//声明样式
cellStyle_header.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
cellStyle_header.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中

4.4、设置背景颜色(填充单元格的颜色,注意:不是背景颜色)
cellStyle_header.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;//填充单元格的颜色填充方式
cellStyle_header.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Aqua.Index;//填充的颜色
4.5、设置边框线为实线
*可以设计其它边框线

            cellStyle_header.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            cellStyle_header.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            cellStyle_header.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            cellStyle_header.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;

4.6、设计表头字体的颜色,字体加粗,字体大小

            NPOI.SS.UserModel.IFont font_header = workbook.CreateFont();//声明字体
            font_header.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;//加粗
            font_header.FontHeightInPoints = 10;//字体大小
            cellStyle_header.SetFont(font_header);//加入单元格
            //给单元格设置样式 循环
            for (int i = 0; i < row1.Cells.Count; i++)
            {
                row1.GetCell(i).CellStyle = cellStyle_header;
            }

5-遍历查询到的数据,设置表格数据
5.1-创建数据内部部分 单元格样式
NPOI.SS.UserModel.ICellStyle cellstyle_value = workbook.CreateCellStyle();//声明样式
cellstyle_value.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
cellstyle_value.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
//设置边框线为实线

  cellstyle_value.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
  cellstyle_value.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
  cellstyle_value.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            cellstyle_value.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;

5.2-遍历数据,创建数据部分行列

  for (int i = 0; i < list.Count; i++)
    {
      5.2.1-创建行

         NPOI.SS.UserModel.IRow row = sheet1.CreateRow(2 + i);//标题和表头已经占了两行
         row.Height = 22 * 20;//设置行高
      5.2.2-创建列,并设置值

         row.CreateCell(0).SetCellValue(i + 1);//序号
         row.CreateCell(1).SetCellValue(list[i].passengerName);
         row.CreateCell(2).SetCellValue(list[i].passengerType);
         row.CreateCell(3).SetCellValue(list[i].certificatesType);
         row.CreateCell(4).SetCellValue(list[i].certificatesCode);
         row.CreateCell(5).SetCellValue(list[i].contactName);
         row.CreateCell(6).SetCellValue(list[i].contactPhone);
       5.2.3-给每个单元格添加样式

          for (int j = 0; j < row.Cells.Count; j++)
            {
              row.GetCell(j).CellStyle = cellstyle_value;
             }
           }

6-设置列宽为自动适应(单元格的长度不一,手动设置很麻烦,让它自适应长度)

          for (int i = 0; i < sheet1.GetRow(1).Cells.Count; i++)
           {
              sheet1.AutoSizeColumn(i);
              sheet1.SetColumnWidth(i, sheet1.GetColumnWidth(i) * 17 / 10);
            }

7、把创建好的Excel输出到浏览器

7.1、点击导出Excel,再点击旅客信息就可以查看到导出的数据信息

          string fileName = "旅客信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
            //把Excel转化为流输出
            MemoryStream BookStream = new MemoryStream();//定义流
            workbook.Write(BookStream);//将工作薄写入流
            BookStream.Seek(0, SeekOrigin.Begin);//输出之前调用Seek(偏移量,游标位置)
            return File(BookStream, "application/vnd.ms-excel", fileName); // 文件类型/文件名称/

//— fileName:浏览器下载名称
#endregion
}
7.2、成功导出的数据
①全部导出的数据

②查询时间段导出的数据

7.2判断异常(关于数据都有一异常的情况,给它添加一个判断)
catch (Exception e)
{
Console.Write(e);
return Content(“数据导出异常”);
}
8、流
用图片方式表达比较通俗易懂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值