利用OpenXml读取、导出Excel
OpenXml是通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。
效果图:
使用它的时候,首选的下载安装这个程序集,下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=30425
安装好了在项目当中引用如下2个

前台弹出框用的是 jBox这个js插件,我用了ajax请求的方式来上传js部分
function ImportExlDataGridRows() {
var html = "<form enctype=\"multipart/form-data\" method=\"post\"> <div style='padding:10px;'>请选择导入的文件:(*.xlsx) <a href=\"download.aspx?ParamValue=1\" rel=\"external\" style=\"color:#000; background:#CCC; width:80px; border:1px solid #09F\" >下载模板</a></div>";
html += "<div style='padding:10px;'><input type=\"file\" name=\"uploadImg\" id=\"uploadImg\" style=\" width:320px; border:1px solid #09F\" /></div>";
html += "</form> ";
var submit = function (v, h, f) {
//判断是否有选择上传文件
var imgPath = $("#uploadImg").val();
if (imgPath == "") {
alert("请选择导入的文件!");
return false;
}
//判断上传文件的后缀名
var strExtension = imgPath.substr(imgPath.lastIndexOf('.') + 1);
if (strExtension != 'xlsx' && strExtension != 'xls') {
alert("请选择导入的文件(*.xlsx)");
return false;
}
$.ajaxFileUpload(
{
url:window.location.href,
secureuri: false,
fileElementId: 'uploadImg',
dataType: 'json',
data:{ "method":"file"},
beforeSend: function () {
$.jBox.tip("正在加载导入", "loading");
},
complete: function () {
},
success: function (data, status) {
//if (typeof (data.Success) != 'undefined') {
if (data.Success != '') {
$.jBox.tip(data.Msg);
}
// }
},
error: function (data, status, e) {
$.jBox.tip(e);
}
}
)
return true;
};
$.jBox(html, { title: "导入预防性维修派单", submit: submit });
}
后台方法
/// <summary>
/// 导入exl
/// </summary>
public void FilePlanImport()
{
string pathWan = "";
try
{
//Web站点下,附件存放的路径
string strFileFolerInWebServer = ConfigurationManager.AppSettings["FileFolerInWebServer"];
HttpFileCollection files = Request.Files;
if (files.Count <=0) {
ResponseWriteSuccessORFail(false, "文件导入");
return;
}
HttpPostedFile postedFile = files[0];
//context.Request.Files["Filedata"];
string savepath = "";
savepath = Server.MapPath(strFileFolerInWebServer) + "\\";//实际保存文件夹路径
string filename = postedFile.FileName; string sNewFileName = "年度生产设备保养计划表_" + DateTime.Now.ToString("yyyyMMddhhmmss");
string sExtension = filename.Substring(filename.LastIndexOf('.'));
if (!Directory.Exists(savepath))
{
Directory.CreateDirectory(savepath);
}
pathWan=savepath + @"\" + sNewFileName + sExtension;
postedFile.SaveAs(pathWan); //保存到文件服务器上的名称 }
catch (Exception ex)
{
LogHelper.WriteLog(ex.Message + ex.StackTrace);
ResponseWriteSuccessORFail(false, "文件导入");
return;
// context.Response.Write("Error: " + ex.Message);
}
DataTable data = null;
int errRows = 0;//
try
{ using (var document = SpreadsheetDocument.Open(pathWan, false))
{ var worksheet = document.GetWorksheet();
var rows = worksheet.Descendants<Row>().ToList();
var sharedStringTable = document.GetSharedStringTable(); // 读取Excel中的数据
IEnumerable<string> rowskey =
new string[] { "OUGUID","AccessoriesCategories" ,"AccessoriesSubclass" ,"MaintenanceMethod",
"Cycle" ,"CycleUnit","EffectiveDate" ,"ClosingDate","EarlyDays","WorkPermit","RepairBusiness"};
ExcelOpenXMLHelper.SetRows = rowskey;//这部分是需要读取那些字段
data = ExcelOpenXMLHelper.ReadExcelData(rows, sharedStringTable); foreach (DataRow item in data.Rows)
{ ....数据插入部分
} }
string msg = "文件导入成功:" + (data.Rows.Count - errRows) + ",错误:" + errRows;
ResponseWriteSuccessORFail(true, msg);
}
catch (Exception ex)
{
LogHelper.WriteLog(ex.Message + ex.StackTrace);
string msg = "文件导入成功:" + (data.Rows.Count - errRows) + ",错误:" + errRows;
ResponseWriteSuccessORFail(false, msg);
}
}
ExcelOpenXMLHelper这是对OpenXml的一些操作封装成了helper类。

导出部分比较简单
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="filePath">
/// The file path.
/// </param>
/// <param name="fileTemplatePath">
/// The file template path.
/// </param>
/// <exception cref="Exception">
/// </exception>
private void ExcelOut(string filePath, string fileTemplatePath)
{
try
{
System.IO.File.Copy(fileTemplatePath, filePath);
}
catch (Exception ex)
{
throw new Exception("复制Excel文件出错" + ex.Message);
} using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, true))
{
var sheetData = document.GetFirstSheetData();
OpenXmlHelper.CellStyleIndex = 1; ////写标题相关信息
this.UpdateTitleText(sheetData);
//循环rows数据写入excl
IEnumerable<string> rowskey =
new string[] { "OUGUID","AccessoriesCategories" ,"AccessoriesSubclass" ,"MaintenanceMethod",
"Cycle" ,"CycleUnit","EffectiveDate" ,"ClosingDate","EarlyDays","WorkPermit","RepairBusiness"}; ExcelOpenXMLHelper.SetRows = rowskey;//这部分是需要读取那些字段
DataTable dt=BLL.BudgetBO();
foreach (DataRow dr in dt.Rows)
{
foreach (string item in rowskey)
{
sheetData.SetCellValue(item, dr[item]);
}
}
// var str = OpenXmlHelper.ValidateDocument(document);验证生成的Excel
}
}
/// <summary>
/// 修改标头
/// </summary>
/// <param name="sheetData">
/// The sheet data.
/// </param>
private void UpdateTitleText(SheetData sheetData)
{
sheetData.UpdateCellText("A1", "xx工信息");
sheetData.UpdateCellText("A2", "制表时间:" + DateTime.Now.ToString("yyyy年MM月dd日HH时"));
sheetData.UpdateCellText("G2", "制表人:admin");
}
以上就是利用OpenXml实现导出导入功能全部代码,Helper类需要的可以留下邮箱。
利用OpenXml读取、导出Excel的更多相关文章
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- 利用POi3.8导出excel产生大量xml临时文件怎么办?
在实际项目中,经常会用到POI3.8来导出excel.而导出excel的时候,会因为残留大量以.xml结尾的文件而导致服务器存储空间急剧增长,最后导致系统挂了.为此,该怎么办呢? .xml后缀残留文件 ...
- .net mvc利用NPOI导入导出excel
1.导出Excel :首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- ASP.Net MVC利用NPOI导入导出Excel
因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// <s ...
- net mvc 利用NPOI导入导出excel
1.导出Excel : 首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- 海量数据Excel报表利器——EasyExcel(一 利用反射机制导出Excel)
EasyExcel 写入(导出) 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来, ...
- .net利用NPOI导入导出Excel
NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...
- asp.net利用剪切板导出excel
public enum ClipboardFormats : uint { CF_TEXT = 1, CF_BITMAP = 2, CF_METAFILEPICT = 3, CF_SYLK = 4, ...
- java - 读取,导出 excel文件数据
首先需下载poi java包,添加至构建路径, 写处理方法: import java.io.FileInputStream;import java.io.FileOutputStream;import ...
随机推荐
- IDEA Maven Hadoop调试hdfs程序
IDEA 远程调试 Hadoop 两大特色:一是采用maven的pom配置:二是直接连接hdfs:9000端口,无须另外在服务端配置参数. 其实内容包含了两种方式:本地与远程调试.这里仅仅只是使用远程 ...
- POJ1961(kmp中Next数组的性质)
对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元. ; int n, kase, Next[maxn]; char ch[maxn]; inli ...
- c#学习系列之装箱拆箱
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...
- P1664 每日打卡心情好
题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...
- 拦截@RequestBody的请求数据
要拦截首先想到的是拦截器,@RequestBody只能以流的方式读取,流被读过一次后,就不在存在了,会导致会续无法处理,因此不能直接读流 为了解决这个问题,思路如下: 1.读取流前先把流保存一下 2. ...
- 【转】一篇文章,教你学会Git
一篇文章,教你学会Git 在日常工作中,经常会用到Git操作.但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼.本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理,掌握常用的一些命令 ...
- [BZOJ1053][SDOI2005]反素数ant 数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1053 假设这个最大的反素数为$x$,那么$1<p<x$中数的因子数都没有$x$ ...
- let块级引起的闭包思考
因为es6在node中用的比较频繁,最近在按计划根据阮一峰的es6教程从头开始学习一遍, 第一步遇到的就是“看似非常熟悉”的let小伙伴,核心character如下: 即:let变量的作用域只在块内. ...
- RecycleView的万能适配器
转载自http://www.cnblogs.com/liushilin/p/5720926.html 由于RecyclerView的Adapter必须继承自RecyclerView.Adapter,并 ...
- SQLite运算符
SQLite运算符 SQLite的运算符是什么? 运算符是一个保留字或一个字符主要用于SQLite语句的WHERE子句来执行操作,如比较和算术运算. 操作符用于指定条件的SQLite语句和作为连词在一 ...