NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作

下面介绍下NPOI操作Excel的方法

首先我们需要下载NPOI的程序集

下载地址 http://npoi.codeplex.com/releases

我下载下来是有这两个文件

这里使用的是net4.0

将下面几个dll添加到项目中并引用

废话不多说  上代码

        /// <summary>
/// create 2016-11-30 by sly
/// 将DataTable数据导入到excel中 此方法直接返回文件给浏览器下载
/// </summary>
/// <param name="data">要导入的数据</param>
/// <param name="isColumnWritten">DataTable的列名是否要导入</param>
/// <param name="sheetName">要导入的excel的sheet的名称</param>
/// <param name="widthDic">要设置的宽度(key 列下标,val 宽度大小)</param>
/// <returns></returns>
public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten, Dictionary<int, int> widthDic = null)
{
int i = ;
int j = ;
int count = ;
ISheet sheet = null; MemoryStream file = new MemoryStream(); if (fileName.IndexOf(".xlsx") > ) //2007版本
workbook = new XSSFWorkbook();
else
if (fileName.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(); try
{
if (workbook != null)
{
sheet = workbook.CreateSheet(sheetName); //设置所有列宽
for (int l = ; l <= data.Rows.Count; l++)
{
sheet.DefaultColumnWidth = ;
} if (widthDic != null)
{
//设定自定义宽度
foreach (var item in widthDic)
{
sheet.SetColumnWidth(item.Key, item.Value);
}
}
}
else
{
return -;
} if (isColumnWritten == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow();
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = ;
}
else
{
count = ;
}
int outRes = -; for (i = ; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = ; j < data.Columns.Count; ++j)
{
if (int.TryParse(data.Rows[i][j].ToString(), out outRes))
{
row.CreateCell(j).SetCellValue(Convert.ToInt32(data.Rows[i][j].ToString()));
}
else
{
if (!string.IsNullOrEmpty(data.Rows[i][j].ToString()) && data.Rows[i][j].ToString().Length > )
{
if ((data.Rows[i][j].ToString().Substring(, ) == "http://" || data.Rows[i][j].ToString().Substring(, ) == "https://"))
{
var TCell = row.CreateCell(j);
HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.Url);//建一个HSSFHyperlink实体,指明链接类型为URL
TCell.SetCellValue(data.Rows[i][j].ToString());
link.Address = data.Rows[i][j].ToString();//给HSSFHyperlink的地址赋值
TCell.Hyperlink = link;
}
else
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
}
else
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
}
}
++count;
}
workbook.Write(file); //写入到excel var context = System.Web.HttpContext.Current;
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
context.Response.Clear();
context.Response.BinaryWrite(file.GetBuffer());
context.Response.End(); return count;
}
catch (Exception ex)
{
return -;
}
}
        /// <summary>
/// 将excel中的数据导入到DataTable中
/// </summary>
/// <param name="sheetName">excel工作薄sheet的名称</param>
/// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
/// <returns></returns>
public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
{
ISheet sheet = null;
DataTable data = new DataTable();
int startRow = ;
try
{
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > ) // 2007版本
workbook = new XSSFWorkbook(fs);
else
if (fileName.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(fs); if (sheetName != null)
{
sheet = workbook.GetSheet(sheetName);
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
{
sheet = workbook.GetSheetAt();
}
}
else
{
sheet = workbook.GetSheetAt();
}
if (sheet != null)
{
IRow firstRow = sheet.GetRow();
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 if (isFirstRowColumn)
{
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
string cellValue = cell.StringCellValue;
if (cellValue != null)
{
DataColumn column = new DataColumn(cellValue);
data.Columns.Add(column);
}
}
}
startRow = sheet.FirstRowNum + ;
}
else
{
startRow = sheet.FirstRowNum;
} //最后一列的标号
int rowCount = sheet.LastRowNum;
for (int i = startRow; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; //没有数据的行默认是null        DataRow dataRow = data.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
dataRow[j] = row.GetCell(j).ToString();
}
data.Rows.Add(dataRow);
}
} return data;
}
catch (Exception ex)
{
return null;
}
}
        /// <summary>
/// 合并单元格
/// </summary>
/// <param name="sheet">要合并单元格所在的sheet</param>
/// <param name="rowstart">开始行的索引</param>
/// <param name="rowend">结束行的索引</param>
/// <param name="colstart">开始列的索引</param>
/// <param name="colend">结束列的索引</param>
public static void SetCellRangeAddress(ISheet sheet, int rowstart, int rowend, int colstart, int colend)
{
CellRangeAddress cellRangeAddress = new CellRangeAddress(rowstart, rowend, colstart, colend);
sheet.AddMergedRegion(cellRangeAddress);
}
            //调用导出方法
new Helper.ExcelHelper("导出的文件名.xls").DataTableToExcel(dt, "sheet1", true, null);
new Helper.ExcelHelper("导出的文件名.xlsx").DataTableToExcel(dt, "sheet1", true, null);

下面是导入

<input type="file" name="fileField" class="file" id="fileField" value="导入" style="display: none;" />
<script>
$("#fileField").live("change", function () {
var Reg = new RegExp("^.+\.(xls)");
var Reg2 = new RegExp("^.+\.(xlsx)");
if (Reg.test($(this).val()) || Reg.test2($(this).val())) {
ImportGrade();//此处调用后台导入方法,这里就不写了哈
} else {
$.IvanDialogOpen({ "Type": "tips", "Info": "仅支持 .xls ,.xlsx 文件", "Plugins": { CloseTime: 800 } });
}
})
</script>
        /// <summary>
/// 导入Demo
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public ActionResult ImportGrade(string filePath)
{
//获取文件在服务器上的路径
string path = string.Concat(FileUpload.GetFilePath(UploadType.ImportGradeFile), filePath);
//根据上传路径获取表格数据
ExcelHelper eh = new ExcelHelper(path.Replace("\\", "/")); DataTable dt = eh.ExcelToDataTable("Sheet1", true); return Content("");
}

以上就是NPOI的简单使用方法

C# 使用NPOI 导出Excel的更多相关文章

  1. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  2. Asp.Net 使用Npoi导出Excel

    引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...

  3. NPOI导出EXCEL 打印设置分页及打印标题

    在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置  sheet1.FitToPage = false; 而 ...

  4. .NET NPOI导出Excel详解

    NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...

  5. NPOI导出Excel(含有超过65335的处理情况)

    NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...

  6. [转]NPOI导出EXCEL 打印设置分页及打印标题

    本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...

  7. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  8. 用NPOI导出Excel

    用NPOI导出Excel public void ProcessRequest(HttpContext context) { context.Response.ContentType = " ...

  9. NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...

  10. NPOI导出excel(带图片)

    近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...

随机推荐

  1. redis info 命令详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt119 Redis Info 命令以一种易于理解和阅读的格式,返回关于 Red ...

  2. Java 反射之动态代理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现.java.la ...

  3. NPIO 导出Execl

    步骤1:导入NOIO.dll    (我导入压缩包中的4.0)

  4. 201521123084 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  5. JAVA基础第八组(5道题)

    36. 37. 38.[程序38] 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. package com.niit.homework1; import java.u ...

  6. 团队作业4——第一次项目冲刺(Alpha版本)1st day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 主界面以及游戏界面大体上完成了 界面内的功能正在写 2.登陆方面 QQ授权还未申请 申请完在登陆界面完成后实现用QQ ...

  7. 201521123078 《Java程序设计》 第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 public static vo ...

  8. Java第七周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 ...

  9. 201521123006 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 本周除了继承,我们还重点学习了多态. (1)多态性在于有相同的形态,却是不同的行为或者说是不 ...

  10. 201521123100 《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...