zoukankan      html  css  js  c++  java
  • Excel 多表头导入导出(借助Aspose)

    需求中Excell多表头,完成导入导出。


    Aspose 代码实现多表头方式借助代码比较繁琐, 借助模板方式。 简化逻辑。 注意,aspose从0开始索引。
    导入部分代码: 实现选择导入Excel,导入Excel后,转换成DataTable, 同时将列明替换成数据库映射字段。(注意,严谨情况下需要比对导入Excel和模板Excel列是否相同,此处逻辑省略。)

    //读取Excel模板
     var wb = new Workbook(Request.Files[0].InputStream);
                    if (wb.Worksheets.Count <= 0)
                    {
                        return Ext.Net.JSON.Serialize(new { success = false, msg = "不是有效的Excel文件" });
                    }
                    var ws = wb.Worksheets[0];
                    var sheet = ws;
    
    //读取Excel内容并将DataTable表头转换为数据库字段。
    //页面Grid集合
                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    serializer.MaxJsonLength = int.MaxValue;
    
                    var gridHeaders= new List<NameDataExeclOrderMap>().DeserializeModel(GridHeaders);
                    var GridModelsList = new { name = "", type = "" }.NMList().DeserializeModel(GridModels); 
                    int firstStartDataRow  = 3;
                    var ExcelDt = ws.Cells.ExportDataTableAsString(firstStartDataRow, 0, ws.Cells.MaxDataRow - firstStartDataRow + 1, gridHeaders.Count, false);
                    var ExcelRows = ExcelDt.Rows.Cast<DataRow>();
                    Func<int, string> ExcelColumnName2DTColumnName = (int colIndex) =>
                    {
                        return gridHeaders.Where(a => a.MapExcelColOrder == colIndex + 1).Select(a => a.DataIndex).FirstOrDefault();
                    };
                    for (var i = 0; i < ExcelDt.Columns.Count; i++)
                    {
                        var findCN = ExcelColumnName2DTColumnName(i);
                        if (!string.IsNullOrWhiteSpace(findCN))
                        {
                            ExcelDt.Columns[i].ColumnName = findCN;
                        }
                    }
    
    //前台传送表头(用于显示,映射数据库字段,MapExcelColOrder )
            public class NameDataExeclOrderMap
            {
                public int MapExcelColOrder {get;set;}
                public string DataIndex { get; set; }
    
                public string Text { get; set; }
            }

    需要前台传送的 表头格式:


    导出模式(部分代码): 

    var ExcelTemplateFileName = Server.MapPath(@"App_DataExcelTemplate导入导出模板.xls");
                Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(ExcelTemplateFileName);            
                var sheet = wb.Worksheets[0];
                
    
                var cellRowIndex = 3; //Excel开始写的行
                foreach (var row in dt.AsEnumerable())
                {
                    foreach (var col in nameKeyMapOrderLst)
                    {
                        if (dt.Columns.Contains(col.DataIndex))
                        {
                            sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].PutValue(row.GetRowValue(col.DataIndex));
                        }
                        else
                        {
                            sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].PutValue("");
                        }
                        sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].SetStyle(_tdStyle);
                    }
                    cellRowIndex++;
                }
    
    
                string fileName = _reportName + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
                wb.Save(System.Web.HttpContext.Current.Server.MapPath("~/ExportFile/") + fileName);
                var Request = System.Web.HttpContext.Current.Request;
                return "http://" + Request.Url.Host + ":" + Request.Url.Port + "/ExportFile/" + fileName;
  • 相关阅读:
    在maven工程中使用groovy
    groovy学习1搭建环境
    Android 中运行时权限获取联系人信息 Demo
    Android 拍照或相册选择照片进行显示缩放位图 Demo
    Android 热点相关操作
    Android 内嵌 HTML5 并进行交互
    AJAX实现局部刷新
    C#主要用于查询sql的web项目:查询以及页面显示数据非常缓慢的改进方案
    配置和读取web.config数据库
    web项目在服务器IIS7上的部署:达到内部网可以通过输入网页直接访问的效果
  • 原文地址:https://www.cnblogs.com/hijushen/p/10854947.html
Copyright © 2011-2022 走看看