对Excel表格数据的导出

2023-05-16

一:有Excel文件模板的导出
(1)判断模板文件是否存在
1.先通过Server.MapPath() 将相对的路径转为实际的物理路径
2.然后在通过IO流判断文件是否存在 例:System.IO.File.Exists()
(2)使用文件流打开模板文件System.IO.File.Open()
1.打开Excel模板,得到一个工作簿 例:NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(templateStream);
2.通过GetSheetAt(0)获取第一个工作表 NumberOfSheets判断有没有工作表
3. PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。
4. 通过CreateCellStyle().构建单元格样式
例:style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;水平居中
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;垂直居中
5.设置边框为实线 例:style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
6.通过遍历循环填充查询出来的数据
(3)以流的方式返回
例:String name=”文件名称”+”.xls”;
(4)把Excel转化为流
1. 定义内存流
例:MemoryStream Book=new MemoryStream();定义内存流
2. 将工作簿写入内存流
例:book.Write(Book);将工作簿写入内存流
3.最后调用Seek()(偏移量,游标位置)方法:获取文件流的长度
(5)返回文件类型
File(fileStream要发送到响应的流,contentType内容类型(MIME 类型),fileDownloadName浏览器中显示的文件下载对话框内要使用的文件名。)
例:return File(Book, “application/vnd.ms-excel”, “文件名称”)
从页面请求到控制器
//导出Excel(数据)
function exportExcel() {
var startEndDate = $("#startEndDate").val();
window.open("@Url.Content("~/OthersMaintenance/ExportARdata/ExportARData?startEndDate=")" + startEndDate);

控制器里查数据
public ActionResult ExportARData(string startEndDate)
{
#region 筛选导出数据
var query = from tbOrder in myModel.B_Order
join tbPNR in myModel.B_PNR on tbOrder.PNRID equals tbPNR.PNRID
join tbUser in myModel.S_User on tbOrder.operatorID equals tbUser.userID
join tbUserGroup in myModel.S_UserGroup on tbUser.userGroupID equals tbUserGroup.userGroupID
orderby tbOrder.orderID
select new ExportARdataVo
{
orderNo = tbOrder.orderNo,//订单编号
payTime = tbOrder.payTime,//支付时间(筛选数据)
payTimeStr = tbOrder.payTime.ToString(),//支付时间(字符串)
totalPrice = tbOrder.totalPrice,//总票价
agencyFee = tbOrder.agencyFee,//代理费
payMoney = tbOrder.payMoney,//支付金额
userGroup = tbUserGroup.userGroupNumber,//用户组号
jobNumber = tbUser.jobNumber,//工号
PNR = tbPNR.PNRNo,//PNR编号
orderStatus = tbOrder.orderStatus//订单状态
};
//判断是否选择时间段
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]);
query = query.Where(m => m.payTime >= dtStart && m.payTime <= dtEnd);
}
}
List list = query.ToList();
#endregion
#region 根据模板文件的Excel导出
//==1-检查模板文件是否存在
// Server.MapPath 将相对的路径转为实际的物理路径
string templatePath = Server.MapPath(”/Document/ARDataTemplate.xls");//("/位置/文件名字”)
//判断模板是否存在
if (!System.IO.File.Exists(templatePath))
{
//如果不存在,就返回失败信息
return Content(“导出失败,请联系网站管理员”);
}
//==2-使用NPOI打开模板Excel
//=2.1-使用文件打开模板文件
FileStream templateStream = System.IO.File.Open(templatePath, FileMode.Open);
//=2.2-使用NPOI打开模板Excel 得到一个工作簿
NPOI.HSSF.UserModel.HSSFWorkbook excelBookTemplate = new NPOI.HSSF.UserModel.HSSFWorkbook(templateStream);
//==3-打开模板所在第一个工作表
NPOI.SS.UserModel.ISheet sheet = excelBookTemplate.GetSheetAt(0);
//构建单元格样式
NPOI.SS.UserModel.ICellStyle style= excelBookTemplate.CreateCellStyle();
//==4-设置标题,如果筛选时间段不为空就拼接上筛选时间段
if (!string.IsNullOrEmpty(startEndDate))
{
//startEndDate(时间段)
//提取模板标题
NPOI.SS.UserModel.IRow rowTitle = sheet.GetRow(0);
rowTitle.GetCell(0).SetCellValue("订单数据 " + startEndDate);
}
//==5-往模板中填充数据
//=5.1-设置数据单元格的样式
//水平垂直居中对齐
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
//设置边框为实线
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thick;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thick;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thick;
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thick;
//==5.2-开始填充数据
int index = 2;//目前这个模板数据开始填充数据的行索引为2
//遍历查询出的数据 填充Excel单元格
for (int i = 0; i < list.Count(); i++)
{
NPOI.SS.UserModel.IRow row = sheet.CreateRow(index);//给sheet添加一行
row.Height = 22 * 20;//设置行高
//设置单元格数据
row.CreateCell(0).SetCellValue(i+1);
row.CreateCell(1).SetCellValue(list[i].orderNo);
row.CreateCell(2).SetCellValue(list[i].payTime.ToString());
row.CreateCell(3).SetCellValue(list[i].totalPrice.ToString());
row.CreateCell(4).SetCellValue(list[i].agencyFee.ToString());
row.CreateCell(5).SetCellValue(list[i].payMoney.ToString());
row.CreateCell(6).SetCellValue(list[i].userGroup.ToString());
row.CreateCell(7).SetCellValue(list[i].jobNumber.ToString());
row.CreateCell(8).SetCellValue(list[i].PNR.ToString());
//设置单元格样式
for (int j = 0; j < row.Cells.Count; j++)
{
row.GetCell(j).CellStyle = style;
}
index++;
}
//以流的方式返回
string fileName = “订单信息” + DateTime.Now.ToString(“yyyy-MM-dd-HH-mm-ss-ffff”) + “.xls”;
//把Excel转化为流,输出
MemoryStream BookStream = new MemoryStream();//定义内存流
excelBookTemplate.Write(BookStream);//将工作薄写入内存流
BookStream.Seek(0, SeekOrigin.Begin);//输出之前调用Seek(偏移量,游标位置)方法:获取文件流的长度
/*参数:File(fileStream要发送到响应的流,
contentType内容类型(MIME 类型),
fileDownloadName浏览器中显示的文件下载对话框内要使用的文件名。) */
//“application/vnd.ms-excel”,fileName格式,名称
return File(BookStream,“application/vnd.ms-excel”,fileName);
#endregion
} }

二:没有模板的导出

  1. 创建Excel对象
    (1) 创建一个工作簿 例:NPOI.HSSF.UserModel.HSSFWorkbook book
    (2) 在工作簿里创建一个工作表 例:NPOI.SS.UserModel.ISheet sheet = book.CreateSheet();
  2. 设置样式
    (1) ICellStyle 声明单元格样式
    (2) IFont 声明字体样式
    (3) SetFont() 把字体样式加入到单元格
  3. 合并单元格(第几行开始,到第几行结束,第几列开始,到第几列结束)
    例:sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 6));
  4. 创建第一行(表头)
    (1) 给sheet添加第一行的头部标题 CreateRow(“索引”) 创建行
    例:NPOI.SS.UserModel.IRow row1 = sheet.CreateRow(0);第一行,索引为0

(2) 设置行高
例:row1.Height = 22 * 20;
5. 创建单元格并设置单元格的值
(1) CreateCell() 创建单元格
(2) SetCellValue() 设置单元格的值
例:row1.CreateCell(0).SetCellValue(“序号”);
6. 通过for循环遍历查询出来的数据
7. 设置列宽为自动适应
例:sheet.AutoSizeColumn();
8. 最后在通过把Excel转化为文件流,输出
(1) 定义内存流 MemoryStream
(2) 将工作簿写入内存流 Write()
(3) 最后调用Seek()(偏移量,游标位置)方法:获取文件流的长度 Seek()
9. return File(fileStream要发送到响应的流,contentType内容类型(MIME 类型),fileDownloadName浏览器中显示的文件下载对话框内要使用的文件名。)
10.
function exportExcel() {
var startEndDate = $("#startEndDate").val();
window.open("@Url.Content("~/OthersMaintenance/ExportLKdata/ExportLKDATA?startEndDate=")" + startEndDate);

    }

public ActionResult ExportLKDATA(string startEndDate)
{
#region 数据查询
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]);
query = query.Where(o => o.createTime >= dtStart && o.createTime <= dtEnd);
}
}
var list = query.ToList();
#endregion
#region 导出Excel表头
//==1、声明一个Workbook对象
//NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
HSSFWorkbook workbook = new HSSFWorkbook();
//==2、创建工作表 Sheet 并设置名称
//创建工作表
ISheet sheet = workbook.CreateSheet();
//设置工作表名称
workbook.SetSheetName(0, “旅客信息”);
//==3、设置标题 合并单元格、设置样式
//=3.1、创建第一行 索引0,设置行高
//创建行
IRow row0 = sheet.CreateRow(0);
//=3.2、创建一个单元格 索引0
//创建单元格
ICell cell0 = row0.CreateCell(0);
//string strDate = DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);
//string strTime = “旅客信息”+strDate;
string strTime = “旅客信息”;
if (!string.IsNullOrEmpty(startEndDate))
{
strTime = strTime + " " + startEndDate;
}
//赋值
cell0.SetCellValue(strTime);
//=3.2.1、创建一个格样式
//声明并创建样式
ICellStyle cellStyle_Title = workbook.CreateCellStyle();
//水平居中
cellStyle_Title.Alignment = HorizontalAlignment.Center;
//垂直居中
cellStyle_Title.VerticalAlignment = VerticalAlignment.Center;
//声明字体
IFont font_title = workbook.CreateFont();
//设置字体颜色
font_title.Color = NPOI.HSSF.Util.HSSFColor.Blue.Index;
//加粗
font_title.Boldweight = (Int16)FontBoldWeight.Bold;
//字体大小
font_title.FontHeightInPoints = 18;
//设置单元格字体
cellStyle_Title.SetFont(font_title);
//=3.2、合并单元格(第几行开始,到第几行结束,第几列开始,到第几列结束)
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 6));
//=3.2.2、设置单元格样式
cell0.CellStyle = cellStyle_Title;
//==4、设置表头
//=4.1-创建一行 索引 1
//给sheet添加第一行的头部标题
NPOI.SS.UserModel.IRow row1 = sheet.CreateRow(1);
//设置行高
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-创建表头的样式
ICellStyle cellStyle_header = workbook.CreateCellStyle();//声明样式
cellStyle_header.Alignment = HorizontalAlignment.Center;//水平居中
cellStyle_header.VerticalAlignment = VerticalAlignment.Center;//垂直居中
//设置背景颜色
cellStyle_header.FillPattern = FillPattern.SolidForeground;
cellStyle_header.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Aqua.Index;
//设置边框线为实线
cellStyle_header.BorderBottom = BorderStyle.Thin;
cellStyle_header.BorderLeft = BorderStyle.Thin;
cellStyle_header.BorderRight = BorderStyle.Thin;
cellStyle_header.BorderTop = BorderStyle.Thin;
//声明字体
IFont font_header = workbook.CreateFont();
//加粗
font_header.Boldweight = (Int16)FontBoldWeight.Bold;
//字体大小
font_header.FontHeightInPoints = 10;
//加入单元格
cellStyle_header.SetFont(font_header);
//=4.4-给每个单元格添加样式
for (int i = 0; i < row1.Cells.Count; i++)
{
row1.GetCell(i).CellStyle = cellStyle_header;
}
#endregion
#region 导出Excel数据
//==5-遍历查询到的数据,设置Excel表格数据
//=5.1-创建数据内部部分 单元格样式
ICellStyle cellstyle_value = workbook.CreateCellStyle();//声明样式
cellstyle_value.Alignment = HorizontalAlignment.Center;//水平居中
cellstyle_value.VerticalAlignment = VerticalAlignment.Center;//垂直居中
//设置边框线为实线
cellstyle_value.BorderLeft = BorderStyle.Thin;
cellstyle_value.BorderTop = BorderStyle.Thin;
cellstyle_value.BorderRight = BorderStyle.Thin;
cellstyle_value.BorderBottom = BorderStyle.Thin;
//=5.2-遍历数据,创建数据部分行列
for (int i = 0; i < list.Count; i++)
{
//5.2.1-创建行
NPOI.SS.UserModel.IRow row = sheet.CreateRow(i + 2);//给sheet添加一行
row.Height = 22 * 20;//设置行高
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 < sheet.GetRow(1).Cells.Count; i++)
{
sheet.AutoSizeColumn(i);
sheet.SetColumnWidth(i, sheet.GetColumnWidth(i) * 17 / 10);
}
#endregion
//==7-将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); // 文件类型/文件名称/

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对Excel表格数据的导出 的相关文章

  • 使用嵌入资源打开 Excel 工作簿文件

    我正在使用 Microsoft Office Interop 打开 Excel 文件 该文件被放置在一个特殊的文件夹中 工作簿代码从该文件夹中读取该文件 现在 要求是Excel文件可以放在任何地方 我认为最好的方法是将 Excel 文件作为
  • Power Query 根据 Excel 列列表过滤 SQL 视图

    有没有办法使用 Power Query 根据 Excel 表列中的值列表过滤 SQL 视图 我有一个返回大量数据 数百万条记录或属性 的 SQL 视图 用户希望根据属性 ID 的 Excel 表格列进行过滤 我知道我可以根据 Power 查
  • COM 错误?打开工作簿两次会导致引用损坏

    归功于fuglede https stackoverflow com users 5085211 fuglede为了引起我的注意 这是 COM 错误吗 我打开 Excel 工作簿 A 然后打开工作簿 B 这两个工作簿在单元格 A1 中都有一
  • VBA 中的 Excel 下拉列表:“无法获取工作表类的 DropDowns 属性”

    我有这个代码 Sub addDropdown Name ActiveSheet DropDowns Add 74 25 60 188 25 87 75 Select Set n ActiveSheet DropDowns Name If N
  • Excel 单元格对齐:例如数值xlLeft、xlRight 还是 xlCenter?

    我一直在尝试对齐 Excel 单元格文本值 我尝试过更常见的xlLeft xlRight但这似乎不起作用 错误是xlLeft没有宣布 我正在使用 Visual Studios 并使用 VB 创建一个 aspx 页面 这是我的代码示例 Dim
  • 如何使用 VBA 在 Excel 中搜索单词然后删除整行? [复制]

    这个问题在这里已经有答案了 请有人帮忙 我正在尝试编写一个 VBA 代码 在 Excel 工作表 D 列中搜索特定单词 DR 然后删除整行 工作表中特定单词多次出现 我想做的就是搜索这些出现的情况 然后删除包含这些单词的整行 我的问题是我不
  • 替换VBA中的变量字符串

    我需要替换字符串中的某些内容 但替换的内容可能会有所不同 有可能 XY test XXxY test XXyyXx TEST yXyy Test 以及几乎任何其他空格和上述情况的组合 我需要替换 test 部分并保留 XXX 所以 当使用简
  • 大型数据集的报告工具/查看器

    我有一个数据处理系统 可以根据其处理的数据生成非常大的报告 我所说的 大 是指该系统的 小 执行在转储到 CSV 文件中时会产生大约 30 MB 的报告数据 而大数据集大约为 130 150 MB 我确信有人有更大的想法 大 但这不是重点
  • 如何使用 C# 和 OleDbConnection 读取 .xlsx 和 .xls 文件?

    以前我使用的是ExcelPackage从 xlsx 文件中读取数据 效果很好 但后来我意识到ExcelPackage不适用于旧的 xls 格式 所以我升级到使用OleDbConnection代替ExcelPackage像这样 var fil
  • 点击后如何等待页面加载

    下面是简单的 IE 自动化代码 只需输入订单号 例如1413105088和邮政编码始终是78759并单击 提交 按钮 然后从结果页面中获取跟踪号码 例如017136295201034并将它们放入 C 列 它按预期工作 但由于 IE 不太可靠
  • 从 Rest API 响应内容处置输出中下载 javascript 中的 excel 文件 [对象,对象]

    我想从我的 angularJs 代码下载一个 excel 文件 我向 Java Rest API 发出 http post 请求并返回带有标头的文件 Content Disposition 附件 文件名 new excel file xls
  • 是否可以编写自定义 Power Query 连接器?

    在 来自其他来源 下的 Power Query 中 我们看到许多专业提供商 Facebook SAP SalesForce 等 我有兴趣编写一个自定义提供程序来访问无法通过任何内置连接器使用的本地专有数据存储 我知道 访问没有支持连接器的数
  • 错误:如何读取 Excel 中的空单元格

    我正在尝试使用 POI 从 Excel 读取数据 如何检查该单元格是否为空单元格 我不知道缺少什么我认为这应该有效 java util Iterator
  • Mac 上使用 Excel VBA 进行正则表达式

    我需要将 regEx 与 Excel VBA 一起使用 我使用的是 Mac OS 10 10 和 Office 2011 因此没有可以使用的 DLL 文件 这里有什么可做的 我读到我必须绑定一个苹果脚本 这是如何完成的以及该脚本需要什么内容
  • 如何使用 xlrd 将新列和行添加到 .xls 文件

    如何向 xlrd 中的工作表添加新列和 或行 我有一个使用 open workbook 读取的 xls 文件 我需要在第一张表中添加一个新列 bouncebacks 然后在该表中添加新行 但我在 xlrd 文档中找不到任何显示如何添加新行和
  • 有没有办法破解 Excel VBA 项目的密码?

    我被要求更新一些 Excel 2003 宏 但 VBA 项目受密码保护 而且似乎缺少文档 没有人知道密码 有没有办法删除或破解 VBA 项目上的密码 你可以直接尝试这个VBA不需要十六进制编辑的方法 它适用于任何文件 xls xlsm xl
  • 获取数据后关闭EXCEL应用程序进程

    我正在尝试通过以下方式从列表中的 Excel 文件获取列数据 private void Form1 Load object sender EventArgs e Excel Application xlApp new Excel Appli
  • 在 Excel 中使用宏进行多选,如何取消选择选择

    我需要使用 MultiSelect 下拉列表创建启用宏的 Excelsheet 用户选择下拉列表之一 然后将值附加到以逗号 分隔的单元格中 如果用户再次选择已经选择的值 则应将其从列表中删除 我能够通过以下代码实现它的第一部分 但无法实现第
  • 按数字键对字典排序

    我有一个带有整数键和整数项的字典 只需要根据键对字典进行排序 但我发现的所有示例仅适用于字符串键 将键作为数组获取 对该数组进行排序 然后使用排序后的数组从字典中提取值 Sub Tester Dim d As Object Dim i As
  • VBA 6:正则表达式无法识别复杂的字符串

    我有这个字符串 1X214X942 0SX 其中每个 X 代表一个 不间断空格 准确地说是空白 ASCII 代码为 160 S 代表一个空格字符 我试图用这个正则表达式来识别它 d 1 3 s d 3 s d 3 d 1 3 d 1 3 d

随机推荐