码迷,mamicode.com
首页 > 编程语言 > 详细

java实现excel文件转换为xml文件

时间:2019-01-19 12:11:31      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:icc   detail   name   time   null   compact   实现   tac   encoding   

一、导包:

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-examples</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1.3</version>
</dependency>

二、代码部分:

public class AnalysisEtoX {

    public static void main(String[] args) {
        try {
            System.out.println("=============");
            // 用输入流从本地拿到对应的Excel文件
            InputStream stream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\试题.xlsx");
            // 指定要生成的xml的路径,并构建文件对象
            File f = new File("test.xml");// 新建个file对象把解析之后得到的xml存入改文件中
            writerXML(stream, f);// 将数据以xml形式写入文本
        } catch (FileNotFoundException e) {
            System.out.println("未找到指定路径的文件!");
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static void writerXML(InputStream stream, File f) throws IOException {
        System.out.println("into writerXML");
        FileOutputStream fo = new FileOutputStream(f);// 得到输入流
        Document doc = readExcell(stream);// 读取EXCEL函数
        Format format = Format.getCompactFormat().setEncoding("UTF-8").setIndent("");
        XMLOutputter XMLOut = new XMLOutputter(format);// 在元素后换行,每一层元素缩排四格
        XMLOut.output(doc, fo);
        fo.close();
    }

    private static Document readExcell(InputStream stream) {
        System.out.println("into readExcell");
        // 设置根<tax_institutions></tax_institutions>元素
        Element root = new Element("tax_institutions");
        Document doc = new Document(root);
        try {
            HSSFWorkbook hw = new HSSFWorkbook(stream);
            // 获取工作薄的个数,即一个excel文件中包含了多少个Sheet工作簿
            int WbLength = hw.getNumberOfSheets();
            System.out.println("WbLength=" + WbLength);

            for (int i = 0; i < WbLength; i++) {
                HSSFSheet shee = hw.getSheetAt(i);
                int length = shee.getLastRowNum();
                System.out.println("行数:" + length);
                for (int j = 1; j <= length; j++) {
                    HSSFRow row = shee.getRow(j);
                    if (row == null) {
                        continue;
                    }
                    int cellNum = row.getPhysicalNumberOfCells();// 获取一行中最后一个单元格的位置
                    System.out.println("列数cellNum:" + cellNum);
                    Element e = null;
                    // 设置根元素下的并列元素<tax_institution></tax_institution>
                    e = new Element("tax_institution");
                    // Element[] es = new Element[16];
                    for (int k = 0; k < cellNum; k++) {
                        HSSFCell cell = row.getCell((short) k);
                        String temp = get(k);
                        System.out.print(k + " " + temp + ":");
                        Element item = new Element(temp);
                        if (cell == null) {
                            item.setText("");
                            e.addContent(item);
                            cellNum++;// 如果存在空列,那么cellNum增加1,这一步很重要。
                            continue;
                        }

                        else {
                            String cellvalue = "";
                            switch (cell.getCellType()) {
                            // 如果当前Cell的Type为NUMERIC
                            case HSSFCell.CELL_TYPE_NUMERIC:
                            case HSSFCell.CELL_TYPE_FORMULA: {
                                // 判断当前的cell是否为Date
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    // 如果是Date类型则,转化为Data格式

                                    // 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                                    // cellvalue =
                                    cell.getDateCellValue().toLocaleString();

                                    // 方法2:这样子的data格式是不带带时分秒的:2011-10-12
                                    Date date = cell.getDateCellValue();
                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                                    cellvalue = sdf.format(date);
                                    item.setText(cellvalue);

                                }
                                // 如果是纯数字
                                else {
                                    // 取得当前Cell的数值
                                    cellvalue = String.valueOf((int) cell.getNumericCellValue());
                                    item.setText(cellvalue);
                                }
                                break;
                            }
                            // 如果当前Cell的Type为STRIN
                            case HSSFCell.CELL_TYPE_STRING:
                                // 取得当前的Cell字符串
                                cellvalue = cell.getRichStringCellValue().getString();
                                item.setText(cellvalue);
                                break;
                            // 默认的Cell值
                            default:
                                cellvalue = " ";
                                item.setText(cellvalue);
                            }
                            e.addContent(item);
                            System.out.println(cellvalue);
                        }
                    }
                    root.addContent(e);

                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                stream.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
        return doc;
    }

    // 设置并列元素里的子元素名
    private static String get(int k) {
        String test = "";
        switch (k) {
        case 0:
            test = "org_name";
            break;
        case 1:
            test = "legal_mobile_phone";
            break;
        case 2:
            test = "org_address";
            break;
        case 3:
            test = "cert_type";
            break;
        case 4:
            test = "postal_code";
            break;
        case 5:
            test = "reg_sum";
            break;
        case 6:
            test = "business_scope";
            break;
        case 7:
            test = "social_credit_code";
            break;
        case 8:
            test = "reg_type";
            break;
        case 9:
            test = "legal_person_name";
            break;
        case 10:
            test = "cert_number";
            break;
        case 11:
            test = "found_time";
            break;
        case 12:
            test = "service_status";
            break;
        case 13:
            test = "staff_sum";
            break;
        case 14:
            test = "partner_sum";
            break;
        case 15:
            test = "is_branch_org";
            break;
        default:
        }
        return test;

    }

}

转载地址csdn:https://blog.csdn.net/weixin_40420734/article/details/79538772

 

注意:

excel版本保存文件的后缀名问题,如果是.xls,使用HSSFWorkbook;如果是xlsx,使用XSSFWorkbook。

版本错误会抛出OfficeXmlFileException!!!

java实现excel文件转换为xml文件

标签:icc   detail   name   time   null   compact   实现   tac   encoding   

原文地址:https://www.cnblogs.com/Pamper-Chen/p/10291004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!