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:''}]]

以上仅作为学习资料,方便自己以后查找,写的不是很详细,如有疑问可以留言。谢谢!

 
 
 
标签: C#

NPOI 2.0 Excel读取显示的更多相关文章

  1. 使用NPOI 2.1.1读取EXCEL2003/2007返回DataTable

    winform中打开excel的筛选器设置为:openFileDialog.Filter = "Excel 文件(*.xls)|*.xls;*.xlsx"; 一,不借助插件读取Ex ...

  2. c#.Net:Excel导入/导出之NPOI 2.0简介

      NPOI 2.0+主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats组成,具体列表如下: 资料来自:百度百科   Ass ...

  3. NPOI 2.0 教程(二):编辑既存的EXCEL文件

    NPOI 2.0 教程(二):编辑既存的EXCEL文件 分类: C#技术 2014-03-11 15:40 993人阅读 评论(3) 收藏 举报 c#excelNPOI 转载请注明出处 http:// ...

  4. Saiku导出excel指标列无线条以及0与空值显示问题(三十二)

    Saiku导出excel指标列无线条以及0与空值显示问题 描述: 数据库中字段值为0 ,与数据库中字段值为 null 时 ,saiku会将为0 以及为 null 的数据都不展示出来,但是我们其实希望数 ...

  5. C# 使用 NPOI 库读写 Excel 文件

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...

  6. 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的路由方案,与原来的方案在使用上差别不 ...

  7. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  8. .net利用NPOI导入导出Excel

    NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...

  9. 【NPOI】.NET EXCEL导入导出开发包

    1.导出 //工作簿HSSFWorkbook HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //ISheet页 ISheet sheet1 = hss ...

随机推荐

  1. 让UIAlertController兼容的同时iphone和ipad

    让UIAlertController兼容的同时iphone和ipad by 吴雪莹 var alert = UIAlertController(title: nil, message: message ...

  2. N-gram统计语言模型(总结)

    N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型 ...

  3. cocos2d-x 3.0rc1 创建project

    1.进入bin文件夹 2.打开CMD命令行窗口中输入命令,然后按Enter(-p 包名 -l 语言 -d 新project存储路径)

  4. WebService到底是什么? [转]

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  5. hdu More is better

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:王老师要找一些男生帮助他完成一项工程.要求最后挑选出的男生之间都是朋友关系,可以说直接的, ...

  6. Ubuntu中编译链接Opencv应用的简便方式

    安装完毕Opencv后,使用下面命令查 看编译/连接參数 pkg-config --cflags --libs opencv 可看到例如以下信息 -I/usr/include/opencv  /usr ...

  7. crawler_wireshark 过滤基础知识

    一.IP过滤:包括来源IP或者目标IP等于某个IP比如:ip.src addr==192.168.0.208  or ip.src addr eq 192.168.0.208 显示来源IP       ...

  8. DES加密深度优化——随机生成加密字符串

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.但该算法一旦密钥固定,加密的字符串也就随之固定,这不利于数据存储安全.而且用该方法加密后有一个 ...

  9. UVA Getting in Line

    题目例如以下: Getting in Line  Computer networking requires that the computers in the network be linked. T ...

  10. 我们的空间是它圆——基于Poicare对宇宙的模型

    一般 状态 在人类文明的开始,并探讨了空间和时间的混乱从来没有停止过.马跑得更快.鱼下潜深.鸟振翅高飞,但是,人类并没有很深的不满潜飞不高.为什么?其原因是,马跑得更快,但它不会不知道他们为什么会跑得 ...