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類需要的可以留下郵箱。
