You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@poi.apache.org by Mark Greene <gr...@gmail.com> on 2006/06/10 22:08:32 UTC

HSSFWorkbook XLS to XML

Hi,

I started searching for API support to convert a workbook into XML. I
couldn't find any within a reasonable time frame so I just made my own. It
uses DOM4J for XML processing. Hopefully this can be of help to some people
or at least a starting point:


import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/*
 * Created on Jun 9, 2006
 */

/**
 * @author Mark J. Greene
 * greenemj@gmail.com
 */
public class Test {

    Namespace spreadsheetNS = new Namespace("",
"urn:schemas-microsoft-com:office:spreadsheet");

    Namespace oNS = new Namespace("o",
"urn:schemas-microsoft-com:office:office");

    Namespace xNS = new Namespace("x",
"urn:schemas-microsoft-com:office:excel");

    Namespace ssNS = new Namespace("ss",
"urn:schemas-microsoft-com:office:spreadsheet");

    Namespace htmlNS = new Namespace("html", "
http://www.w3.org/TR/REC-html40");

    public Test() throws IOException {
        int rowCount = 3;
        int colCount = 2;
        Document doc = this.generateExcelSkeletonDoc();
        Element root = doc.getRootElement();
        HSSFWorkbook wb = new HSSFWorkbook();

        this.createTestWorkbook(wb);

        this.writeXLSToXMLDoc(rowCount, colCount, root, wb);

        //      Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(System.out, format);
        writer.write(doc);
    }


    private void writeXLSToXMLDoc(int rowCount, int colCount, Element root,
HSSFWorkbook wb) {
        int numOfSheets = wb.getNumberOfSheets();
        for (int i = 0; i < numOfSheets; i++) {
            HSSFSheet sheet = wb.getSheetAt(i);
            Element worksheet = root.addElement("Worksheet");
            worksheet.addAttribute(new QName("Name", ssNS), wb.getSheetName
(i));
            Element tableElm = worksheet.addElement("Table");

            for (int x = 0; x < rowCount; x++) {
                HSSFRow dataRow = sheet.getRow(x);
                Element rowElm = tableElm.addElement("Row");

                // Iterator would return cell values in reverse order...use
for loop instead
                //                Iterator cellItr = dataRow.cellIterator();
                //                while (cellItr.hasNext()) {
                //                    HSSFCell cell = (HSSFCell)
cellItr.next();
                //                    Element data = rowElm.addElement
("Cell").addElement("Data");
                //
                //                    data.addAttribute(new QName("Type",
ssNS), "String");
                //                    data.setText(cell.getStringCellValue
());
                //                }
                for (int y = 0; y < colCount; y++) {
                    HSSFCell cell = dataRow.getCell((short) y);
                    Element data = rowElm.addElement
("Cell").addElement("Data");

                    data.addAttribute(new QName("Type", ssNS), "String");
                    data.setText(cell.getStringCellValue());
                }
            }

        }
    }

    private void createTestWorkbook(HSSFWorkbook wb) {
        HSSFSheet tmpSheet = wb.createSheet();
        HSSFRow row1 = tmpSheet.createRow(0);
        HSSFRow row2 = tmpSheet.createRow(1);
        HSSFRow row3 = tmpSheet.createRow(2);

        row1.createCell((short) 0).setCellValue("Cell Value 1");
        row1.createCell((short) 1).setCellValue("Cell Value 2");

        row2.createCell((short) 0).setCellValue("Cell Value 3");
        row2.createCell((short) 1).setCellValue("Cell Value 4");

        row3.createCell((short) 0).setCellValue("Cell Value 5");
        row3.createCell((short) 1).setCellValue("Cell Value 6");
    }

    private Document generateExcelSkeletonDoc() {
        Document excelDoc = DocumentHelper.createDocument();

        Element root = excelDoc.addElement(
                "Workbook",
                "urn:schemas-microsoft-com:office:spreadsheet");
        root.add(oNS);
        root.add(xNS);
        root.add(ssNS);
        root.add(htmlNS);

        //setup <ExcelWorkbook> element
        Element excelWorkBook = root.addElement(
                "ExcelWorkbook",
                "urn:schemas-microsoft-com:office:excel");

        excelWorkBook.addElement("ProtectStructure").setText("False");
        excelWorkBook.addElement("ProtectWindows").setText("False");

        //setup <Styles> and <stlye>'s element
        Element styles = root.addElement("Styles");

        Element style = styles.addElement("Style");
        style.addAttribute(new QName("ID", ssNS), "Default");
        style.addAttribute(new QName("Name", ssNS), "Normal");
        style.addElement("Alignment").addAttribute(new QName("Vertical",
ssNS), "Bottom");
        style.addElement("Borders");
        style.addElement("Font");
        style.addElement("Interior");
        style.addElement("NumberFormat");
        style.addElement("Protection");

        style = styles.addElement("Style");
        style.addAttribute(new QName("ID", ssNS), "s26");
        style.addElement("NumberFormat").addAttribute(new QName("Format",
ssNS), "@");

        Element workbookOptions = root.addElement(
                "WorksheetOptions",
                "urn:schemas-microsoft-com:office:excel");
        workbookOptions.addElement("ProtectObjects").setText("False");
        workbookOptions.addElement("ProtectScenarios").setText("False");

        return excelDoc;
    }

    public static void main(String[] args) throws Exception {
        new Test();
    }
}