POI读取excel转换成XML

来源:互联网 发布:网络cv设备 编辑:程序博客网 时间:2024/05/18 19:42

前期准备

-eclipse
-poi-3.16 jar包
-jdom-2.0.6 jar包
-xmlbeans-2.3.0 jar包

业务需要

测试系统时遇到一个小问题时,系统采用xml导入批量数据,且xml模板中存在一对一(a和b)和一对多(a和c)关系,同时在系统业务中,存在随机抽取的流程操作,xml模板导入的部分数据a需要从oracle中提取,本人通过excel模板编辑数据a和b,通过部分字段来控制变量便于测试,以下代码把excel转换成xml。

注意:这是本人第一次写导入excel代码,勿喷,欢迎交流
注意:本文仅适用于与c的数目相同的转换
注意:此代码只依据第一个listEnt来获取C对应的n(即item的数目)

EXCEL模板

此处忽略表头

读取的listEnt则是由A+B+C*n组成

代码

-引用的jar包

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;

-主代码

public class excelToXML {    public static void main(String[] args) {        //仅适用于一个三级产品目录一个产品分类,若存在多个产品分类,请转换成XML后手动增加        try {            excel2XML("D:\\18_FOR_TEST\\input.xlsx");// 读取excel的路径            System.out.println("XML啦啦啦啦");        } catch (IOException e) {            e.printStackTrace();            System.out.println("读取excel失败");        }    }    @SuppressWarnings("resource")    public static void excel2XML(String filename) throws IOException {        InputStream input = new FileInputStream(filename);        Workbook wb = new XSSFWorkbook(input);        Sheet sheet = wb.getSheetAt(0); // 获得第一个表单        int rowCount = sheet.getPhysicalNumberOfRows();// 获取总行数        List<String> listEach = new ArrayList<String>();        // 获取ItemNum并赋值        int it = 0, itemNum = 0;        for (int r = 0; r < rowCount; r++) {            // 判断是否两行的数据是否相同            if (r < 1)                continue;            if (sheet.getRow(r - 1).getCell(1).toString().equals(sheet.getRow(r).getCell(1).toString())) {                it++;            } else {                itemNum = it + 1;                break;            }        }        List<List<String>> listAllRow = new ArrayList<List<String>>();// 中转-存放所有row的数据        for (int r = 0; r < rowCount; r++) {            Row row = sheet.getRow(r);            int rowNum = row.getRowNum();            if (rowNum % itemNum == 0) {                listEach = saveAllCell(row);            } else {                listEach = saveItemCell(row);            }            listAllRow.add(listEach);        }        // 切割listAllRow 把每个企业的ABC数据放在一个listEnt里面        List<List<String>> listEnt = new ArrayList<List<String>>();// 中转-存放单个企业的数据        List<List<List<String>>> listAll = new ArrayList<List<List<String>>>();// 存放所有row的数据        for (int i = 0; i < rowCount / itemNum; i++) {            listEnt = listAllRow.subList(itemNum * i, itemNum * (i + 1));            listAll.add(listEnt);        }        // 开始创建XML        Document document = DocumentHelper.createDocument();        Element datas = document.addElement("datas");// 创建根节点        // 逐级创建节点        for (int i = 0; i < listAll.size(); i++) {            Element data = datas.addElement("data");// 创建data节点            for (int j = 0; j < itemNum; j++) {                // 用集合的长度判断是 allCell数据(59)还是item数据(9if (listAll.get(i).get(j).size() > 50) {                    createSonNode(data, listAll.get(i).get(j));                } else {                    createItemNode(data, listAll.get(i).get(j));                }            }        }        OutputFormat format = OutputFormat.createPrettyPrint();        format.setEncoding("UTF-8");//gb2312        File file = new File("D:\\18_FOR_TEST\\OUTPUT.xml");// 输出xml的路径        XMLWriter writer;        try {            writer = new XMLWriter(new FileOutputStream(file), format);            // 设置是否转义,默认是true,代表转义            writer.setEscapeText(false);            writer.write(document);            writer.close();        } catch (IOException e) {            e.printStackTrace();        }    }    // 创建A和B结点    public static void createSonNode(Element data, List<String> listEachRow) {        Element JDCC_TEMCYDB = data.addElement("JDCC_TEMCYDB");// A节点        Element CYDBH = JDCC_TEMCYDB.addElement("CYDBH");// A编号        CYDBH.setText("<![CDATA[" + listEachRow.get(0) + "]]>");        Element SJDWMC = JDCC_TEMCYDB.addElement("SJDWMC");//         SJDWMC.setText("<![CDATA[" + listEachRow.get(1) + "]]>");        Element SJDWDZ = JDCC_TEMCYDB.addElement("SJDWDZ");//         SJDWDZ.setText("<![CDATA[" + listEachRow.get(2) + "]]>");        Element SJDWFRDB = JDCC_TEMCYDB.addElement("SJDWFRDB");//         SJDWFRDB.setText("<![CDATA[" + listEachRow.get(3) + "]]>");        Element SJDWLXR = JDCC_TEMCYDB.addElement("SJDWLXR");//         SJDWLXR.setText("<![CDATA[" + listEachRow.get(4) + "]]>");        Element SJDWLXRDH = JDCC_TEMCYDB.addElement("SJDWLXRDH");//         SJDWLXRDH.setText("<![CDATA[" + listEachRow.get(5) + "]]>");                Element SJDWYYZZ = JDCC_TEMCYDB.addElement("SJDWYYZZ");//         SJDWYYZZ.setText("<![CDATA[" + listEachRow.get(6) + "]]>");        Element SJDWJGDM = JDCC_TEMCYDB.addElement("SJDWJGDM");//         SJDWJGDM.setText("<![CDATA[" + listEachRow.get(7) + "]]>");        Element SJDWYZBM = JDCC_TEMCYDB.addElement("SJDWYZBM");//         SJDWYZBM.setText("<![CDATA[" + listEachRow.get(8) + "]]>");        Element SCDWMC = JDCC_TEMCYDB.addElement("SCDWMC");//         SCDWMC.setText("<![CDATA[" + listEachRow.get(9) + "]]>");        Element SCDWDZ = JDCC_TEMCYDB.addElement("SCDWDZ");//         SCDWDZ.setText("<![CDATA[" + listEachRow.get(10) + "]]>");        Element SCDWLXDH = JDCC_TEMCYDB.addElement("SCDWLXDH");//         SCDWLXDH.setText("<![CDATA[" + listEachRow.get(11) + "]]>");        Element SCDWYZBM = JDCC_TEMCYDB.addElement("SCDWYZBM");//         SCDWYZBM.setText("<![CDATA[" + listEachRow.get(12) + "]]>");        Element SCDWFRDB = JDCC_TEMCYDB.addElement("SCDWFRDB");//         SCDWFRDB.setText("<![CDATA[" + listEachRow.get(13) + "]]>");        Element SCDWLXR = JDCC_TEMCYDB.addElement("SCDWLXR");//        SCDWLXR.setText("<![CDATA[" + listEachRow.get(14) + "]]>");        Element SCDWYYZZ = JDCC_TEMCYDB.addElement("SCDWYYZZ");//         SCDWYYZZ.setText("<![CDATA[" + listEachRow.get(15) + "]]>");        Element SCDWJGDM = JDCC_TEMCYDB.addElement("SCDWJGDM");//         SCDWJGDM.setText("<![CDATA[" + listEachRow.get(16) + "]]>");        Element QYGM = JDCC_TEMCYDB.addElement("QYGM");        QYGM.setText("<![CDATA[" + listEachRow.get(17) + "]]>");        Element JJLX = JDCC_TEMCYDB.addElement("JJLX");        JJLX.setText("<![CDATA[" + listEachRow.get(18) + "]]>");            Element ZSBH = JDCC_TEMCYDB.addElement("ZSBH");        ZSBH.setText("<![CDATA[" + listEachRow.get(19) + "]]>");        Element CPMC = JDCC_TEMCYDB.addElement("CPMC");        CPMC.setText("<![CDATA[" + listEachRow.get(20) + "]]>");        Element CPGGXH = JDCC_TEMCYDB.addElement("CPGGXH");        CPGGXH.setText("<![CDATA[" + listEachRow.get(21) + "]]>");        Element SCRQ = JDCC_TEMCYDB.addElement("SCRQ");        SCRQ.setText("<![CDATA[" + listEachRow.get(22) + "]]>");        Element SCPH = JDCC_TEMCYDB.addElement("SCPH");        SCPH.setText("<![CDATA[" + listEachRow.get(23) + "]]>");        Element SB = JDCC_TEMCYDB.addElement("SB");        SB.setText("<![CDATA[" + listEachRow.get(24) + "]]>");        Element CYSL = JDCC_TEMCYDB.addElement("CYSL");        CYSL.setText("<![CDATA[" + listEachRow.get(25) + "]]>");        Element CPDJ = JDCC_TEMCYDB.addElement("CPDJ");        CPDJ.setText("<![CDATA[" + listEachRow.get(26) + "]]>");        Element CYJS = JDCC_TEMCYDB.addElement("CYJS");        CYJS.setText("<![CDATA[" + listEachRow.get(27) + "]]>");        Element BZZXBZ = JDCC_TEMCYDB.addElement("BZZXBZ");        BZZXBZ.setText("<![CDATA[" + listEachRow.get(28) + "]]>");        Element FYZT = JDCC_TEMCYDB.addElement("FYZT");        FYZT.setText("<![CDATA[" + listEachRow.get(29) + "]]>");        Element BYLJFCDD = JDCC_TEMCYDB.addElement("BYLJFCDD");        BYLJFCDD.setText("<![CDATA[" + listEachRow.get(30) + "]]>");        Element JSYDD = JDCC_TEMCYDB.addElement("JSYDD");        JSYDD.setText("<![CDATA[" + listEachRow.get(31) + "]]>");        Element JSYJZRQ = JDCC_TEMCYDB.addElement("JSYJZRQ");        JSYJZRQ.setText("<![CDATA[" + listEachRow.get(32) + "]]>");        Element SCPL = JDCC_TEMCYDB.addElement("SCPL");        SCPL.setText("<![CDATA[" + listEachRow.get(33) + "]]>");        Element CPDJWY = JDCC_TEMCYDB.addElement("CPDJWY");        CPDJWY.setText("<![CDATA[" + listEachRow.get(34) + "]]>");        Element HGDXCP = JDCC_TEMCYDB.addElement("HGDXCP");        HGDXCP.setText("<![CDATA[" + listEachRow.get(35) + "]]>");        Element PLZHZWY = JDCC_TEMCYDB.addElement("PLZHZWY");        PLZHZWY.setText("<![CDATA[" + listEachRow.get(36) + "]]>");        Element QTXX = JDCC_TEMCYDB.addElement("QTXX");        QTXX.setText("<![CDATA[" + listEachRow.get(37) + "]]>");        Element BZ = JDCC_TEMCYDB.addElement("BZ");        BZ.setText("<![CDATA[" + listEachRow.get(38) + "]]>");        Element SJDWYJ = JDCC_TEMCYDB.addElement("SJDWYJ");        SJDWYJ.setText("<![CDATA[" + listEachRow.get(39) + "]]>");        Element CYDWYJ = JDCC_TEMCYDB.addElement("CYDWYJ");        CYDWYJ.setText("<![CDATA[" + listEachRow.get(40) + "]]>");              Element CYDD = JDCC_TEMCYDB.addElement("CYDD");        CYDD.setText("<![CDATA[" + listEachRow.get(41) + "]]>");        Element JDCC_TEMJYBGB = data.addElement("JDCC_TEMJYBGB");// B节点        Element JYBGBH = JDCC_TEMJYBGB.addElement("JYBGBH");// B编号        JYBGBH.setText("<![CDATA[" + listEachRow.get(42) + "]]>");        Element CPBH = JDCC_TEMJYBGB.addElement("CPBH");        CPBH.setText("<![CDATA[" + listEachRow.get(43) + "]]>");        Element CYRQ = JDCC_TEMJYBGB.addElement("CYRQ");        CYRQ.setText("<![CDATA[" + listEachRow.get(44) + "]]>");        Element CYRY = JDCC_TEMJYBGB.addElement("CYRY");        CYRY.setText("<![CDATA[" + listEachRow.get(45) + "]]>");        Element YPDDRQ = JDCC_TEMJYBGB.addElement("YPDDRQ");        YPDDRQ.setText("<![CDATA[" + listEachRow.get(46) + "]]>");        Element JYFYRY = JDCC_TEMJYBGB.addElement("JYFYRY");        JYFYRY.setText("<![CDATA[" + listEachRow.get(47) + "]]>");        Element YPDJ = JDCC_TEMJYBGB.addElement("YPDJ");        YPDJ.setText("<![CDATA[" + listEachRow.get(48) + "]]>");        Element FYZT1 = JDCC_TEMJYBGB.addElement("FYZT");        FYZT1.setText("<![CDATA[" + listEachRow.get(49) + "]]>");        Element YQRQ = JDCC_TEMJYBGB.addElement("YQRQ");        YQRQ.setText("<![CDATA[" + listEachRow.get(50) + "]]>");        Element SFHG = JDCC_TEMJYBGB.addElement("SFHG");        SFHG.setText("<![CDATA[" + listEachRow.get(51) + "]]>");        Element JYYJ = JDCC_TEMJYBGB.addElement("JYYJ");        JYYJ.setText("<![CDATA[" + listEachRow.get(52) + "]]>");        Element JYJL = JDCC_TEMJYBGB.addElement("JYJL");        JYJL.setText("<![CDATA[" + listEachRow.get(53) + "]]>");        Element BZ1 = JDCC_TEMJYBGB.addElement("BZ");        BZ1.setText("<![CDATA[" + listEachRow.get(54) + "]]>");        Element PZR = JDCC_TEMJYBGB.addElement("PZR");        PZR.setText("<![CDATA[" + listEachRow.get(55) + "]]>");        Element SHR = JDCC_TEMJYBGB.addElement("SHR");        SHR.setText("<![CDATA[" + listEachRow.get(56) + "]]>");        Element ZJR = JDCC_TEMJYBGB.addElement("ZJR");        ZJR.setText("<![CDATA[" + listEachRow.get(57) + "]]>");        // 移除已遍历的A和B数据        for (int i = 0; i < 58; i++) {            listEachRow.remove(0);        }        createItemNode(data, listEachRow);    }    // 创建C结点    public static void createItemNode(Element data, List<String> listEachRow) {        Element JDCC_TEMJYXMB = data.addElement("JDCC_TEMJYXMB");// C节点        Element MC = JDCC_TEMJYXMB.addElement("MC");        MC.setText("<![CDATA[" + listEachRow.get(0) + "]]>");        Element BZZ = JDCC_TEMJYXMB.addElement("BZZ");        BZZ.setText("<![CDATA[" + listEachRow.get(1) + "]]>");        Element JCZ = JDCC_TEMJYXMB.addElement("JCZ");        JCZ.setText("<![CDATA[" + listEachRow.get(2) + "]]>");        Element DXPD = JDCC_TEMJYXMB.addElement("DXPD");        DXPD.setText("<![CDATA[" + listEachRow.get(3) + "]]>");        Element DW = JDCC_TEMJYXMB.addElement("DW");        DW.setText("<![CDATA[" + listEachRow.get(4) + "]]>");        Element ZHPD = JDCC_TEMJYXMB.addElement("ZHPD");        ZHPD.setText("<![CDATA[" + listEachRow.get(5) + "]]>");        Element ZYCD = JDCC_TEMJYXMB.addElement("ZYCD");        ZYCD.setText("<![CDATA[" + listEachRow.get(6) + "]]>");        Element SFSY = JDCC_TEMJYXMB.addElement("SFSY");        SFSY.setText("<![CDATA[" + listEachRow.get(7) + "]]>");    }    // 获取C的值    public static List<String> saveItemCell(Row row) {        List<String> listPart = new ArrayList<String>();        // c获取改行的所有cell数据        for (int c = 0; c < 66; c++) {            Cell cell = row.getCell(c);            //在allCell的数据 只遍历 不取值            if (cell.getColumnIndex() < 58) {                continue;            }            String a = getCellValue(cell);            listPart.add(a);        }        return listPart;    }    // 获取整行的值    public static List<String> saveAllCell(Row row) {        List<String> listAll = new ArrayList<String>();        // c获取改行的所有cell数据        for (int c = 0; c < 66; c++) {            Cell cell = row.getCell(c);            String a = getCellValue(cell);            listAll.add(a);        }        return listAll;    }    // 判断cell类型 取值    public static String getCellValue(Cell cell) {        if (cell.getCellTypeEnum() == CellType.BLANK) {// 为空则返回空格        //if (cell==null || cell.toString().trim().equals("")) {            //cell.setCellValue("空白辅助测试");            return " ";        }        if (cell.getCellTypeEnum() == CellType.NUMERIC) {            if ("yyyy/mm;@".equals(cell.getCellStyle().getDataFormatString())                    || "m/d/yy".equals(cell.getCellStyle().getDataFormatString())                    || "yy/m/d".equals(cell.getCellStyle().getDataFormatString())                    || "mm/dd/yy".equals(cell.getCellStyle().getDataFormatString())                    || "dd-mmm-yy".equals(cell.getCellStyle().getDataFormatString())                    || "yyyy/m/d".equals(cell.getCellStyle().getDataFormatString())) {                String cal = new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue());                return cal;            } else {                cell.setCellType(CellType.STRING);                return cell.toString();            }        }        if (cell.getCellTypeEnum() == CellType.STRING) {            return cell.toString().replaceAll("[\\t\\n\\r]", "");        }        return "没有判断就返回";    }

附上参考的blog文地址