// Copyright � 2006-2007 ASERT. Released under the Canoo Webtest license. package com.canoo.webtest.plugins.exceltest; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.canoo.webtest.engine.ContextHelper; import com.canoo.webtest.interfaces.IContentFilter; /** * @author Rob Nielsen * @webtest.step category="Excel" * name="excelStructureFilter" * alias="structureFilter" * description="Extracts the structure of the current <key>xls</key> document, as a xml file." */ public class ExcelStructureFilter extends AbstractExcelStep implements IContentFilter { public void doExecute() throws Exception { final HSSFWorkbook excelWorkbook = getExcelWorkbook(); final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); final Document doc = builder.newDocument(); final Element root = doc.createElement("excelWorkbook"); doc.appendChild(root); root.setAttribute("backup", String.valueOf(excelWorkbook.getBackupFlag())); root.setAttribute("numberOfFonts", String.valueOf(excelWorkbook.getNumberOfFonts())); root.setAttribute("numberOfCellStyles", String.valueOf(excelWorkbook.getNumCellStyles())); root.setAttribute("numberOfNames", String.valueOf(excelWorkbook.getNumberOfNames())); final Element sheets = doc.createElement("sheets"); for(int i=0; i < excelWorkbook.getNumberOfSheets(); i++) { final HSSFSheet sheetAt = excelWorkbook.getSheetAt(i); final Element sheetElement = doc.createElement("sheet"); sheetElement.setAttribute("index", String.valueOf(i)); sheetElement.setAttribute("name", excelWorkbook.getSheetName(i)); sheetElement.setAttribute("firstRow", String.valueOf(sheetAt.getFirstRowNum())); sheetElement.setAttribute("lastRow", String.valueOf(sheetAt.getLastRowNum())); sheetElement.setAttribute("physicalRows", String.valueOf(sheetAt.getPhysicalNumberOfRows())); sheetElement.setAttribute("defaultRowHeight", String.valueOf(sheetAt.getDefaultRowHeight())); sheetElement.setAttribute("defaultColumnWidth", String.valueOf(sheetAt.getDefaultColumnWidth())); sheetElement.setAttribute("fitToPage", String.valueOf(sheetAt.getFitToPage())); sheets.appendChild(sheetElement); } root.appendChild(sheets); final StringWriter sw = new StringWriter(); writeXmlFile(doc, sw); ContextHelper.defineAsCurrentResponse(getContext(), sw.toString(), "text/xml", getClass()); } protected void writeXmlFile(final Document doc, final Writer writer) throws IOException { final OutputFormat format = new OutputFormat(doc); format.setIndenting(true); format.setEncoding("ISO-8859-1"); format.setLineWidth(50); final XMLSerializer serializer = new XMLSerializer(writer, format); serializer.asDOMSerializer(); serializer.serialize(doc.getDocumentElement()); writer.close(); } }