利用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; 80px; border:1px solid #09F" >下载模板</a></div>";
    html += "<div style='padding:10px;'><input type="file" name="uploadImg" id="uploadImg"  style="  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类需要的可以留下邮箱。

  

   

原文地址:https://www.cnblogs.com/jxluowei/p/3899734.html