Как создать XML из Excel (XSLX), используя Java - PullRequest
0 голосов
/ 04 июля 2011

Я читаю файл Excel (XSLX), используя Java в NetBeans 7.0. Я могу прочитать содержимое листа Excel и распечатать его для вывода.

Теперь мне нужно преобразовать данные Excel в файл XML. Теги будут заголовками столбцов, и каждая строка переходит в соответствующие теги.

Это входная рабочая таблица в файле xslx. ID, Переменная, desc и примечания являются заголовками столбцов.

ID          Variable     Desc     Notes
B0001                    VSI_C  
B0001           1        VSI_C_R    
B0001           2        VSI_C_P    
B0002                    VSI_C_L    
B0003                    VSI_C_H    
B0004                    VSI_C_O    

Теперь я преобразовываю эти данные в файл XML. Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?>
<Bin_code>
<DCT>
    <ID>B0001</ID>
    <Variable/>
    <Desc>VSI_C</Desc>
    <Notes/>
</DCT>
<DCT>
    <ID>B0001</ID>
    <Variable/>
    <Desc>VSI_C_R</Desc>
    <Notes/>
</DCT>
     ............
     ...............
</Bin_code>

Я пытался до этого. Я знаю, что должен использовать объект «лист». Но я не уверен, как это использовать.

import java.io.File;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.*;
import org.apache.poi.ss.usermodel.Cell;
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.ss.usermodel.WorkbookFactory;

public class XSLXReader {   
public static void main(String[] args) 
{   
    DataInputStream in = null;
    BufferedReader br = null;
    FileWriter fostream;
    FileWriter fostreamBatch;
    BufferedWriter out = null;
    BufferedWriter outBatch = null;
    String strOutputPath = "D:\\Proj\\Current_\\";
    String strFilePrefix = "Master 5.2-B";
    String strLine;

    try {           
    InputStream inputStream = new FileInputStream(new File("D:\\Proj\\Current_\\Master A-B.xlsx"));
    Workbook wb = WorkbookFactory.create(inputStream);            
    Sheet sheet = wb.getSheet("Bin-code");

    in = new DataInputStream(inputStream);
    br = new BufferedReader(new InputStreamReader(in));

    fostream = new FileWriter(strOutputPath+"\\"+strFilePrefix+".xml");
    out = new BufferedWriter(fostream);

    out.write("<Bin-code>");

    while ((strLine = br.readLine()) != null)
    {
        out.write("<DCT>");
        out.write("<ID>" + strLine.substring(1, strLine.length()) + "</ID>");

        out.write("</DCT>");

    }
    out.write("</Bin-code>");
} catch (Exception e) {         
    e.printStackTrace();        
}   
}
* *} Тысяча двадцать-один

Пожалуйста, помогите мне преобразовать входные данные в xslx в выходные данные в xml, как показано выше.

Спасибо Рамм

Ответы [ 2 ]

5 голосов
/ 04 июля 2011

Вы не должны использовать InputStream для непосредственного чтения файла.После того, как вы открыли книгу и получили доступ к Листу, вы можете просто выполнить итерацию по всем строкам на листе, а затем выполнить итерации по ячейкам в строке.Например, на сайте Apache POI по адресу http://poi.apache.org/spreadsheet/quick-guide.html#Iterator. Затем вы можете либо распечатать свой XML вручную, как вы, либо использовать одну из множества библиотек XML и DTD, чтобы сделать это за вас.

Вот полный источник, который работает:

import java.io.*;
import org.apache.poi.ss.usermodel.*;
import java.text.*;

public class XSLXReader {
    static DecimalFormat df = new DecimalFormat("#####0");

    public static void main(String[] args) {
        FileWriter fostream;
        PrintWriter out = null;
        String strOutputPath = "D:\\Proj\\Current_\\";
        String strFilePrefix = "Master 5.2-B";

        try {
            InputStream inputStream = new FileInputStream(new File("D:\\Proj\\Current_\\Master A-B.xlsx"));
            Workbook wb = WorkbookFactory.create(inputStream);
            Sheet sheet = wb.getSheet("Bin-code");

            fostream = new FileWriter(strOutputPath + "\\" + strFilePrefix+ ".xml");
            out = new PrintWriter(new BufferedWriter(fostream));

            out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            out.println("<Bin-code>");

            boolean firstRow = true;
            for (Row row : sheet) {
                if (firstRow == true) {
                    firstRow = false;
                    continue;
                }
                out.println("\t<DCT>");
                out.println(formatElement("\t\t", "ID", formatCell(row.getCell(0))));
                out.println(formatElement("\t\t", "Variable", formatCell(row.getCell(1))));
                out.println(formatElement("\t\t", "Desc", formatCell(row.getCell(2))));
                out.println(formatElement("\t\t", "Notes", formatCell(row.getCell(3))));
                out.println("\t</DCT>");
            }
            out.write("</Bin-code>");
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String formatCell(Cell cell)
    {
        if (cell == null) {
            return "";
        }
        switch(cell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                return "";
            case Cell.CELL_TYPE_BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case Cell.CELL_TYPE_ERROR:
                return "*error*";
            case Cell.CELL_TYPE_NUMERIC:
                return XSLXReader.df.format(cell.getNumericCellValue());
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            default:
                return "<unknown value>";
        }
    }

    private static String formatElement(String prefix, String tag, String value) {
        StringBuilder sb = new StringBuilder(prefix);
        sb.append("<");
        sb.append(tag);
        if (value != null && value.length() > 0) {
            sb.append(">");
            sb.append(value);
            sb.append("</");
            sb.append(tag);
            sb.append(">");
        } else {
            sb.append("/>");
        }
        return sb.toString();
    }
}

Это производит вывод:

<?xml version="1.0" encoding="UTF-8"?>
<Bin-code>
    <DCT>
        <ID>B0001</ID>
        <Variable/>
        <Desc>VSI_C</Desc>
        <Notes/>
    </DCT>
    <DCT>
        <ID>B0001</ID>
        <Variable>1</Variable>
        <Desc>VSI_C_R</Desc>
        <Notes/>
    </DCT>
    <DCT>
        <ID>B0001</ID>
        <Variable>2</Variable>
        <Desc>VSI_C_P</Desc>
        <Notes/>
    </DCT>
    <DCT>
        <ID>B0002</ID>
        <Variable/>
        <Desc>VSI_C_L</Desc>
        <Notes/>
    </DCT>
    <DCT>
        <ID>B0003</ID>
        <Variable/>
        <Desc>VSI_C_H</Desc>
        <Notes/>
    </DCT>
    <DCT>
        <ID>B0004</ID>
        <Variable/>
        <Desc>VSI_C_O</Desc>
        <Notes/>
    </DCT>
</Bin-code>
0 голосов
/ 19 июня 2018

импорт java.io. *;

import org.apache.poi.ss.usermodel. *;

import java.text. *;

открытый класс XSLXReader {

static DecimalFormat df = new DecimalFormat("#####0");

public static void main(String[] args) {

    FileWriter fostream;

    PrintWriter out = null;

    String strOutputPath = "C://Users//853053//Downloads//poi-bin-3.17-20170915.tar";

    // String strFilePrefix = "Master 5.2-B";

    try {

        InputStream inputStream = new FileInputStream(new File("C://Users//853053//Downloads//poi-bin-3.17-20170915.tar//Master 5.2-B.xls"));

        Workbook wb = WorkbookFactory.create(inputStream);

        Sheet sheet = wb.getSheet("Sheet1");

        // fostream = new FileWriter(strOutputPath + "\\" + strFilePrefix+
        // ".xml");

        // out = new PrintWriter(new BufferedWriter(fostream));

        System.out.println("try");

        boolean firstRow = true;

        for (Row row : sheet) {

            if (firstRow == true) {

                firstRow = false;

                continue;

            }

            fostream = new FileWriter(new File(strOutputPath
                    + File.separator + formatCell(row.getCell(4)) + ".xml"));

            System.out.println("try1" + strOutputPath + File.separator
                    + formatCell(row.getCell(4)) + ".xml");

            out = new PrintWriter(new BufferedWriter(fostream));

            out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

            out.println("<Bin-code>");

            out.println("\t<DCT>");

            out.println(formatElement("\t\t", "ID",
                    formatCell(row.getCell(0))));

            out.println(formatElement("\t\t", "Variable",
                    formatCell(row.getCell(1))));

            out.println(formatElement("\t\t", "Desc",
                    formatCell(row.getCell(2))));

            out.println(formatElement("\t\t", "Notes",
                    formatCell(row.getCell(3))));

            out.println(formatElement("\t\t", "txn_id",
                    formatCell(row.getCell(4))));

            out.println("\t</DCT>");

            out.write("</Bin-code>");

            out.flush();

            out.close();

        }

        // out.write("</Bin-code>");

        // out.flush();

        // out.close();

    } catch (Exception e) {

        e.printStackTrace();

    }

}

@SuppressWarnings("deprecation")
private static String formatCell(Cell cell)

{

    if (cell == null) {

        return "";

    }

    switch (cell.getCellType()) {

    case Cell.CELL_TYPE_BLANK:

        return "";

    case Cell.CELL_TYPE_BOOLEAN:

        return Boolean.toString(cell.getBooleanCellValue());

    case Cell.CELL_TYPE_ERROR:

        return "*error*";

    case Cell.CELL_TYPE_NUMERIC:

        return XSLXReader.df.format(cell.getNumericCellValue());

    case Cell.CELL_TYPE_STRING:

        return cell.getStringCellValue();

    default:

        return "<unknown value>";

    }

}

private static String formatElement(String prefix, String tag, String value) {

    StringBuilder sb = new StringBuilder(prefix);

    sb.append("<");

    sb.append(tag);

    if (value != null && value.length() > 0) {

        sb.append(">");

        sb.append(value);

        sb.append("</");

        sb.append(tag);
        sb.append(">");

    } else {

        sb.append(">");

        sb.append("<");

        sb.append(tag);

        sb.append("/>");

    }

    return sb.toString();

}

}

...