NPOI 2.0 Excel读取显示
NPOI 2.0 Excel读取显示
最近接到需求,需要把excel表格里的数据原样展示到web页面,主要是满足随意跨行跨列。
之前用过一点NPOI,不过接触的不太多,趁这次机会再熟悉一下。由于操作的excel都是2007以上的版本,所以选择了2.0的版本。
这里稍微提一下2.0与1.X的区别:2.0主要针对2007及以上版本,1.X主要针对2003,此外方法也略有不同,但是过渡还是很平缓的,这里不做过多的赘述。
详情请看官网:点击此处
假设一下是excel 文件的 Sheet1页,转换成web之后仍是同样效果。
| 日期 | 买入 | ||
| 买入额(万元) | 偿还额(万元) | 净买入额(万元) | |
| 2014-1-30 | 67644.71 | 58602.77 | 9041.94 |
| 2013-12-31 | 520660.88 | 449425.22 | 71235.66 |
| 2013-11-29 | 515912.92 | 525626.82 | -9713.91 |
| 2013-10-31 | 758822.25 | 738848.47 | 19973.79 |
后台代码:

using NPOI;
using NPOI.HSSF.UserModel; //2003版本
using NPOI.XSSF.UserModel; //2007版本
using NPOI.SS.UserModel;
public string ConvertExcelToJsonString()
{
try
{
string excelName = "data.xlsx";
string sheet = "Sheet3";
string filePath = HttpContext.Current.Server.MapPath(String.Format("~/App_Data/{0}", excelName));
//HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
//HSSFSheet sht = (HSSFSheet)wb.GetSheet(sheet); 如果是2003 则用HSS开头的对象。
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
XSSFWorkbook xworkbook = new XSSFWorkbook(file);
XSSFSheet xsheet = (XSSFSheet)xworkbook.GetSheet(sheet);
int rowsCount = xsheet.PhysicalNumberOfRows; //取行Excel的最大行数
int colsCount = xsheet.GetRow(0).PhysicalNumberOfCells;//取得Excel的列数
StringBuilder excelJson = new StringBuilder();
//StringBuilder table = new StringBuilder();
int colSpan;
int rowSpan;
bool isByRowMerged;
excelJson.Append("[");
//table.Append("<table border='1px'>");
for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
{
if (rowIndex > 0) { excelJson.Append(","); }
excelJson.Append("[");
for (int colIndex = 0; colIndex < colsCount; colIndex++)
{
//获取Table某个TD合并的列数和行数等信息。与Excel中对应Cell的合并行数和列数一致。
GetTdMergedInfo(xsheet, rowIndex, colIndex, out colSpan, out rowSpan, out isByRowMerged);
//被合并的行或列不输出的处理方式不一样
//如果已经被 行 合并包含进去了就不输出TD了。
if (isByRowMerged)
{
continue;
}
excelJson.Append("{");
excelJson.Append(string.Format("Text:'{0}'", xsheet.GetRow(rowIndex).GetCell(colIndex)));
excelJson.Append(string.Format(",ColSpan:'{0}'",colSpan));
excelJson.Append(string.Format(",RowSpan:'{0}'",rowSpan));
excelJson.Append(",Width:''");
excelJson.Append(",Align:'center'");
excelJson.Append(",Index:''");
excelJson.Append("},");
//列被合并之后此行将少输出colSpan-1个TD。
if (colSpan > 1)
colIndex += colSpan - 1;
}
excelJson.Remove(excelJson.Length-1,1);
excelJson.Append("]");
}
excelJson.Append("]");
return excelJson.toString(); }
catch (Exception ex)
{
return null;
}
}


/// <summary>
/// 获取Table某个TD合并的列数和行数等信息。与Excel中对应Cell的合并行数和列数一致。
/// </summary>
/// <param name="rowIndex">行号</param>
/// <param name="colIndex">列号</param>
/// <param name="colspan">TD中需要合并的行数</param>
/// <param name="rowspan">TD中需要合并的列数</param>
/// <param name="isByRowMerged">此单元格是否被某个行合并包含在内。如果被包含在内,将不输出TD。</param>
/// <returns></returns>
private void GetTdMergedInfo(XSSFSheet xsheet, int rowIndex, int colIndex, out int colspan, out int rowspan, out bool isByRowMerged)
{
colspan = 1;
rowspan = 1;
isByRowMerged = false;
int regionsCuont = xsheet.NumMergedRegions;//取得合并单元格的个数
//Region region;
for (int i = 0; i < regionsCuont; i++)
{
//region = xsheet.GetMergedRegionAt(i); 此方法为1.2版本,高版本已去掉
CellRangeAddress range = xsheet.GetMergedRegion(i);//取得第i个合并单元格的跨越范围
xsheet.IsMergedRegion(range);
//region = xsheet.GetMergedRegion(i);
if (range.FirstRow == rowIndex && range.FirstColumn == colIndex)
{
colspan = range.LastColumn - range.FirstColumn + 1;
rowspan = range.LastRow - range.FirstRow + 1;
return;
}
else if (rowIndex > range.FirstRow && rowIndex <= range.LastRow && colIndex >= range.FirstColumn && colIndex <= range.LastColumn)
{
isByRowMerged = true;
}
}
}

前台代码:

function ExcelDataBind(data) {
var data = result.Data.toJSON() //此处拿到后台Json字符串
var tableObj= $('<table border="1" width="100%"></table>');
var theadObj = $("<thead></thead>");
var tbodyobj = $("<tbody></tbody>");
for (var i = 0; i < data.length; i++) {
var trHtml = '<tr>';
//以下特殊业务需要,请参考自己逻辑修改
for (var j = 0; j < data[i].length; j++) {
var tdType = data[i][j].Index == 1 ? "th" : "td";
var colspan = data[i][j].ColSpan == 1 ? "" : " colspan=" + data[i][j].ColSpan;
var rowspan = data[i][j].RowSpan == 1 ? "" : " rowspan=" + data[i][j].RowSpan;
trHtml += '<' + tdType + colspan + rowspan + ' width=' + data[i][j].Width + ' align="' + data[i][j].Align + '">' + data[i][j].Text + '</' + tdType + '>';
}
trHtml += '</tr>';
if (data[i][0].Index == 1) {
theadObj.append(trHtml);
}else {
tbodyobj.append(trHtml);
}
}
tableObj.append(theadObj).append(tbodyobj);
}

以上功能是将 excel 里的数据转化成json格式(如下),因为还有别的用处,所以就没直接转换成Html的table。如果想直接转换成Table,请参考官网例子

[[{Text:'日期',ColSpan:'1',RowSpan:'2',Width:'',Align:'center',Index:''},{Text:'买入',ColSpan:'3',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'买入额(万元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'偿还额(万元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'净买入额(万元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'30-一月-2014',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'67644.71',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'58602.77',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'9041.94',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'31-十二月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'520660.88',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'449425.22',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'71235.66',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'29-十一月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'515912.92',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'525626.82',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'-9713.91',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'31-十月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'758822.25',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'738848.47',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'19973.79',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}]]

以上仅作为学习资料,方便自己以后查找,写的不是很详细,如有疑问可以留言。谢谢!
NPOI 2.0 Excel读取显示的更多相关文章
- 使用NPOI 2.1.1读取EXCEL2003/2007返回DataTable
winform中打开excel的筛选器设置为:openFileDialog.Filter = "Excel 文件(*.xls)|*.xls;*.xlsx"; 一,不借助插件读取Ex ...
- c#.Net:Excel导入/导出之NPOI 2.0简介
NPOI 2.0+主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats组成,具体列表如下: 资料来自:百度百科 Ass ...
- NPOI 2.0 教程(二):编辑既存的EXCEL文件
NPOI 2.0 教程(二):编辑既存的EXCEL文件 分类: C#技术 2014-03-11 15:40 993人阅读 评论(3) 收藏 举报 c#excelNPOI 转载请注明出处 http:// ...
- Saiku导出excel指标列无线条以及0与空值显示问题(三十二)
Saiku导出excel指标列无线条以及0与空值显示问题 描述: 数据库中字段值为0 ,与数据库中字段值为 null 时 ,saiku会将为0 以及为 null 的数据都不展示出来,但是我们其实希望数 ...
- C# 使用 NPOI 库读写 Excel 文件
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- .net利用NPOI导入导出Excel
NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...
- 【NPOI】.NET EXCEL导入导出开发包
1.导出 //工作簿HSSFWorkbook HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //ISheet页 ISheet sheet1 = hss ...
随机推荐
- Chain of Responsibility - 责任链模式
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...
- 浏览器HTTP缓存原理分析(转)
章节目录 浏览器缓存原理 文字版描述 一图以蔽之 缓存相关首部字段 request缓存相关首部字段 response缓存相关首部字段 实体首部缓存相关字段 缓存配置的一些注意事项 以前项目中遇到了很多 ...
- javascript系列之DOM(一)
原文:javascript系列之DOM(一) DOM(document object moudle),文档对象模型.它是一个中立于语言的应用程序接口(API),允许程序访问并修改文档的结构,内容和样式 ...
- hdu 新生晚会
Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法? ...
- jQuery - 基于serializeArray的serializeObject
将表单序列化成JSON对象,注意不管是自实现的serializeObject()还是原生的serializeArray(),所要序列化的控件都必须要有name,而不是id jQuery.prototy ...
- 也许游戏 它P/N图分析
关于游戏的问题,更多的时候是使用P/N图分析 p n p n p n p n n n n n n n n n p n p n p n p n n n n n ...
- Session与Caching
Session与Caching 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了A ...
- 【SSH三框架】Struts2第一章的基础:第一次写Struts2规划
今年八月,当已经SSH三架完成学业.然后,他感动Android开展.三个框架已经很长的时间做无用的东西.所以,如果你想花三四天的时间来复习一下,写在博客. 附带SSH整个jar包网盘下载:http:/ ...
- Tomcat剖析(四):Tomcat默认连接器(2)
Tomcat剖析(四):Tomcat默认连接器(2) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...
- Appium键盘操作
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap<String, Integer> key ...