`
lishumingwm163.com
  • 浏览: 338019 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

excel 通用导入

    博客分类:
  • java
 
阅读更多
通用的POI导入Excel解决方案
引言:在项目中,经常免不了要导入、导出Excel,导出Excel稍微简单点,制作一张模板,然后将查询之后的数据写入到模板中即可,导出程序可以做到一次写好,基本上就可以通用。

但导入Excel相对麻烦点,一般情况下,导入的程序无法通用的主要原因是:对于不同的导入模板,字段field与单元格cellRef的映射关系是不相同的,这就导致对每一个导入模板都要去写一套相似的代码;我们应该想办法解决这个问题,减少每次导入Excel时都去拷贝粘贴相同的代码。

问题的关键是解决:字段field与单元格cellRef的映射关系;

如何解决呢?将这个映射关系从程序中抽取出来。

如何抽取呢?曾经跟一些同事、朋友聊天时谈到这个话题,

有的建议将这个映射关系写在Excel单元格里面,并且设置将单元格隐藏;

有的建议用2个相似的excel模板文件,将映射关系放在A模板文件中,B模板文件提供给用户导入数据;

有的建议将映射关系单独写在xml文件中;。。。。

经过再三权衡,最终我选择使用方法3,即将映射关系写在XML配置文件中。

通常情况下,我们的导入模板是大致为这样的:




(1)    有颜色的单元格是需要被导入到后台的有用信息,且单元格中的单词即为field信息

(2)    橙色单元格为只填写/读取一次的数据。

(3)    蓝色单元格为循环填写/读取的数据,A10单元格中,End表示读取到这里时,循环结束。

所以我们字段field与单元格cellRef映射信息可以是这样子的:

<?xml version="1.0" encoding="UTF-8"?>

<excelImport>

    <onceImport>

       <![CDATA[

           C3 = ORDER_NBR,          H3 = CUST_NAME,

           N3 = CUST_LINK_INFO,     C4 = CUST_ID,

           H4 = CUST_ADDR,          N4 = ONCE_TYPE,

           C5 = CONTACT_ID,         H5 = CUST_FILE,

           N5 = LOOP_TYPE,          C6 = PRO_NAME,

           H6 = OPPO_ORDER_NBR,     N6 = COOPERATE_MODE,

           C11 = AUD_MANGER,        N11 = BM,

           C12 = ORDER_COMMENT

       ]]>

    </onceImport>

    <repeatImport>

       <![CDATA[

           A9 = STRNUM,             B9 = FRI_AREA,

           C9 = OPP_A,              D9 = SEC_AREA,

           E9 = OPP_B,              F9 = NUM,

           G9 = SERV_NBR,           H9 = SPEED,

           I9 = FRI_ADDR,           J9 = PORT_TYPE_A,

           K9 = FRI_LINK_A,         L9 = SEC_ADDR,

           M9 = PORT_TYPE_B,        N9 = FRI_LINK_B,

           O9 = APPLY_INFO,         P9 = ORDER_DATE,

           Q9 = HIRE_TIME,          R9 = DISCOUNT_MID,

           S9 = BILL_DATE,          T9 = OLD_BILL_DATE,

           U9 = LINE_COMMENT

       ]]>

       <endCode>End</endCode>

    </repeatImport>

</excelImport>


(1)    <onceImport/> 表示只需要一次导入的数据,字段field与单元格cellRef的映射关系写在CDATA区中。

(2)    <repeatImport/>表示需要循环导入的数据,字段field与单元格cellRef的映射关系写在CDATA区中。<endCode/>表示循环终止的字符。

下面说一下,根据这个XML描述文件,我们需要从Excel中解析出什么样的数据格式来:

/**

* 读取导入的Excel的内容

* 模板要求:

* (1)开始重复行与End行 有且只能有 一空行

*/

public class ExcelImportUtil

{

    /**

     * 读取导入的Excel的文件内容

     * @param xmlFile            描述被导入的Excel的格式的XML文件

     * @param importExcelStream 被导入的XML文件

     * @return                   Excel中需要导入的数据

     */

    public static ExcelData readExcel(String xmlFile, InputStream importExcelStream) throws ExcelImportException

    {}

}

/**

* Excel导入的信息

*/

import java.util.List;

import java.util.Map;

public class ExcelData

{

    // 一次导入的数据,key就是field,一个ImportCellDesc描述了一个单元格(field,value,单元格名称)

    private Map<String, ImportCellDesc> onceData;

    // 重复导入的数据

    private List<Map<String, ImportCellDesc>> repeatData;

    // setter/getter

}

/**

* 单元格的描述信息

* (1)数据格式校验时,可以精确定位到某个单元格。

*/

public class ImportCellDesc

{

    /**

     * 引用的单元格;如:A3

     */

    private String cellRef;

    /**

     * 单元格的对应数据库的字段名称;

     * 如:fieldName = "username"

     */

    private String fieldName;

    /**

     * 字段值,如:张三

     */

    private String fieldValue;

    // setter/getter

}


调用代码:

ExcelData excelData = ExcelImportUtil.readExcel(xmlFile, importExcelStream);

然后在这个基础上,我们可以对数据进行一些操作,如:数据校验,插入数据。。。

其中数据校验时,如果数据不合法,给用户的提示信息可以精确指定某个单元格的数据不合法。(如:提示信息为:A3单元格数据不合法!)

注:使用了如下第三方JAR包:

Jdom   :解析XML描述文件

POI3.0  : 读取Excel文件

Xml描述文件,必须放在cn.zhaoql.excelimport.xml这个包里面。

分享到:
评论

相关推荐

    excel通用导入工具类

    兼容excel各种版本,灵活控制导入列,导入行,多sheet导入。。。

    JAVA中excel导入导出通用方法

    JAVA中excel导入导出通用方法 JAVA 中 excel 导入导出通用方法是指在 Java 项目中实现 excel 文件的导入和导出功能。这种方法可以应用于各种需要 excel 文件交互的业务场景中。 一、引入依赖 在 Java 项目中想要...

    Excel导入工具——通用版本(大家学习研究)

    Excel导入工具是为了解决数据批量录入和管理问题而设计的一种实用程序,它允许用户将数据从Excel表格中批量导入到其他系统或数据库中。这个通用版本特别适用于那些需要频繁处理大量结构化数据的场景,比如数据分析、...

    通用导入Excel例子.rar

    支持通用Excel/WPS的版本快速导入,Office支持Excel97,Excel2003,Excel2010等多个版本,WPS的版本支持不限制,能自动识别导入excel的页签,根据所选页签导入后自动返回当前表格包含的列标题信息和含数据信息,这些...

    C#通用Excel导入导出工具类

    本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...

    通用Excel数据导入模块

    通用Excel数据导入模块

    多功能通用Excel导入导出数据

    标题 "多功能通用Excel导入导出数据" 描述的是一个针对Excel数据处理的工具或库,它已经被二次封装,简化了导入导出操作。用户只需引入指定的jar包,并通过一行代码即可实现数据的导入和导出功能。描述中强调了其...

    通用导入导出excel 类

    。net通用导入导出 excel 类,返回datatable

    通用excel凭证导入工具(T3).zip

    为了提高工作效率并减少人为错误,"通用excel凭证导入工具(T3)"应运而生。这个工具专门设计用于帮助财务人员快速、准确地将Excel表格中的会计数据导入到T3系统中,极大地优化了会计流程。 T3工具是一款专为中小型...

    能实现一对多关联的通用EXCEL导入功能

    在IT行业中,开发一个能实现一对多关联的通用EXCEL导入功能是一项常见的需求,尤其是在数据管理、数据分析或者系统集成的场景下。这个功能允许用户通过上传Excel文件来批量导入包含复杂关系的数据,例如一个学生可以...

    Delphi中从Excel导入数据的通用方法

    总之,Delphi中从Excel导入数据的通用方法主要依赖于第三方组件,如JvExcel。通过这些组件,我们可以方便地访问Excel文件中的数据,并将其集成到Delphi应用程序中。当然,还有其他库和方法,如使用Microsoft的OLE ...

    excel导入导出通用组件

    这是一个利用poi封装的excel导入导出通用组件,详细用法请访问:http://fuyangrong.top/2018/01/29/excel导入导出通用组件/

    通用导入Excel

    "通用导入Excel"是一个功能强大的工具,它允许用户通过简单的接口将Excel数据导入到各种系统中。这个工具的特点在于其通用性,它能处理多种类型的导入需求,并且已经过优化,使其更加简单易用。 在Java开发环境中,...

    java注解实现通用Excel中文表格转实体对象列表,支持中文表头,Excel批量导入,excel转实体对象,excel读取

    java注解实现通用Excel中文表格转实体对象列表,支持中文表头,在Excel数据导入使用的通用工具类,代码简洁优雅 。基于注解实现的支持中文表头的读取Excel数据并转换为实体对象列表的工具类,使用该工具类可将Excel...

    通用的Excel导入导出

    在这个“通用的Excel导入导出”项目中,我们看到作者创建了一个类来实现这个功能,让我们详细了解一下相关的知识点。 1. **Apache POI**:这是Apache软件基金会的一个开源项目,它提供了一组API,专门用于读写...

    java_poi导入excel通用工具类V0915

    "java_poi导入excel通用工具类V0915" 提供了一种通用的方式来处理Excel数据的导入工作,它支持多种赋值方式,包括单个对象、列表对象以及指定坐标的赋值。 首先,让我们深入理解一下这个工具类的主要功能: 1. **...

    通用Excel导入设计源程序

    【通用Excel导入设计源程序】是一种实用的工具,主要用于将Excel数据高效地导入到数据库中。这个程序的独特之处在于它的灵活性和可配置性,通过XML文件的设定,用户可以根据自己的需求定制导入规则,使得数据迁移...

    一个通用从数据库导出excel、excel导入数据库组件所用到的jar包

    标题中的“一个通用从数据库导出excel、excel导入数据库组件所用到的jar包”指的是一个Java开发的工具,主要用于数据的导入导出操作。这个工具可以方便地将数据库中的数据导出为Excel格式,同时也可以将Excel文件中...

    java_poi导入excel通用工具类

    这个"java_poi导入excel通用工具类"是利用Java的POI库和一些额外的技术来实现对Excel数据的导入功能,使得开发人员能够方便地将Excel数据转化为Java对象或者对已有对象进行填充。下面我们将深入探讨相关的知识点。 ...

Global site tag (gtag.js) - Google Analytics