diff options
author | Stanislav Wolski <stanislau.wolski@gmail.com> | 2017-03-29 09:06:23 +0300 |
---|---|---|
committer | Stanislav Wolski <stanislau.wolski@gmail.com> | 2017-03-29 09:06:23 +0300 |
commit | 89d0bf924e9b8a4fc6782599fd80ec7c7798e016 (patch) | |
tree | 5fb3cecab5ca02801e4209634880d6fe85295cb6 /WEB-INF | |
download | grid-export-excel-java-89d0bf924e9b8a4fc6782599fd80ec7c7798e016.zip grid-export-excel-java-89d0bf924e9b8a4fc6782599fd80ec7c7798e016.tar.gz grid-export-excel-java-89d0bf924e9b8a4fc6782599fd80ec7c7798e016.tar.bz2 |
[add] initial importHEADorigin/masterorigin/HEADmaster
Diffstat (limited to 'WEB-INF')
-rw-r--r-- | WEB-INF/lib/jxl.jar | bin | 0 -> 726430 bytes | |||
-rw-r--r-- | WEB-INF/lib/jxl.sources.zip | bin | 0 -> 800716 bytes | |||
-rw-r--r-- | WEB-INF/src/CSVGenerator.java | 16 | ||||
-rw-r--r-- | WEB-INF/src/ExcelGenerator.java | 19 | ||||
-rw-r--r-- | WEB-INF/src/HTMLGenerator.java | 16 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/BaseWriter.java | 14 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/CSVWriter.java | 91 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/CSVxml.java | 117 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/Colors.java | 43 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelCell.java | 56 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelColumn.java | 80 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelGenerator.java | 16 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelRow.java | 39 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelWriter.java | 327 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/ExcelXmlParser.java | 161 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/HTMLWriter.java | 129 | ||||
-rw-r--r-- | WEB-INF/src/com/dhtmlx/xml2excel/RGBColor.java | 75 | ||||
-rw-r--r-- | WEB-INF/web.xml | 31 |
18 files changed, 1230 insertions, 0 deletions
diff --git a/WEB-INF/lib/jxl.jar b/WEB-INF/lib/jxl.jar Binary files differnew file mode 100644 index 0000000..ffb0215 --- /dev/null +++ b/WEB-INF/lib/jxl.jar diff --git a/WEB-INF/lib/jxl.sources.zip b/WEB-INF/lib/jxl.sources.zip Binary files differnew file mode 100644 index 0000000..0c16710 --- /dev/null +++ b/WEB-INF/lib/jxl.sources.zip diff --git a/WEB-INF/src/CSVGenerator.java b/WEB-INF/src/CSVGenerator.java new file mode 100644 index 0000000..a2508f4 --- /dev/null +++ b/WEB-INF/src/CSVGenerator.java @@ -0,0 +1,16 @@ +import java.io.IOException; +import java.net.URLDecoder; +import javax.servlet.http.*; + +import com.dhtmlx.xml2excel.CSVWriter; + +public class CSVGenerator extends HttpServlet { + + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.setCharacterEncoding("UTF-8"); + String xml = req.getParameter("grid_xml"); + xml = URLDecoder.decode(xml, "UTF-8"); + CSVWriter writer = new CSVWriter(); + writer.generate(xml, resp); + } +} diff --git a/WEB-INF/src/ExcelGenerator.java b/WEB-INF/src/ExcelGenerator.java new file mode 100644 index 0000000..51a4e54 --- /dev/null +++ b/WEB-INF/src/ExcelGenerator.java @@ -0,0 +1,19 @@ + +import java.io.IOException; +import java.net.URLDecoder; + +import javax.servlet.http.*; + +import com.dhtmlx.xml2excel.ExcelWriter; + + +@SuppressWarnings("serial") +public class ExcelGenerator extends HttpServlet { + + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String xml = req.getParameter("grid_xml"); + xml = URLDecoder.decode(xml, "UTF-8"); + (new ExcelWriter()).generate(xml, resp); + } + +}
\ No newline at end of file diff --git a/WEB-INF/src/HTMLGenerator.java b/WEB-INF/src/HTMLGenerator.java new file mode 100644 index 0000000..ea10cff --- /dev/null +++ b/WEB-INF/src/HTMLGenerator.java @@ -0,0 +1,16 @@ +import java.io.IOException; +import java.net.URLDecoder; +import javax.servlet.http.*; + +import com.dhtmlx.xml2excel.HTMLWriter; + +public class HTMLGenerator extends HttpServlet { + + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.setCharacterEncoding("UTF-8"); + String xml = req.getParameter("grid_xml"); + xml = URLDecoder.decode(xml, "UTF-8"); + HTMLWriter writer = new HTMLWriter(); + writer.generate(xml, resp); + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/BaseWriter.java b/WEB-INF/src/com/dhtmlx/xml2excel/BaseWriter.java new file mode 100644 index 0000000..754c926 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/BaseWriter.java @@ -0,0 +1,14 @@ +package com.dhtmlx.xml2excel; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletResponse; + +public abstract class BaseWriter { + public abstract void generate(String xml, HttpServletResponse resp) throws IOException; + public abstract int getColsStat(); + public abstract int getRowsStat(); + public abstract void setWatermark(String watermark); + public abstract void setFontSize(int fontsize); +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/CSVWriter.java b/WEB-INF/src/com/dhtmlx/xml2excel/CSVWriter.java new file mode 100644 index 0000000..8131d79 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/CSVWriter.java @@ -0,0 +1,91 @@ +package com.dhtmlx.xml2excel; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletResponse; + +public class CSVWriter extends BaseWriter { + int rows = 0; + int cols = 0; + String watermark = null; + + public void generate(String xml, HttpServletResponse resp) throws IOException { + CSVxml data = new CSVxml(xml); + + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("application/vnd.ms-excel"); + resp.setCharacterEncoding("UTF-8"); + resp.setHeader("Content-Disposition", "attachment;filename=grid.csv"); + resp.setHeader("Cache-Control", "max-age=0"); + + String[] csv; + PrintWriter writer = resp.getWriter(); + + csv = data.getHeader(); + while(csv != null){ + writer.append(dataAsString(csv)); + csv = data.getHeader(); + } + + csv = data.getRow(); + if (csv !=null) + cols = csv.length; + while(csv != null){ + writer.append(dataAsString(csv)); + csv = data.getRow(); + rows += 1; + } + + csv = data.getFooter(); + while(csv != null){ + writer.append(dataAsString(csv)); + writer.flush(); + csv = data.getFooter(); + } + + drawWatermark(writer); + + writer.flush(); + writer.close(); + } + + private String dataAsString(String[] csv) { + if (csv.length == 0) return ""; + + StringBuffer buff = new StringBuffer(); + for ( int i=0; i<csv.length; i++){ + if (i>0) + buff.append(","); + if (!csv[i].equals("")){ + buff.append("\""); + buff.append(csv[i].replace("\"", "\"\"")); + buff.append("\""); + } + } + buff.append("\n"); + return buff.toString(); + } + + private void drawWatermark(PrintWriter writer) { + if (watermark != null) + writer.append(watermark); + } + + public int getColsStat() { + return cols; + } + + public int getRowsStat() { + return rows; + } + + public void setWatermark(String watermark) { + this.watermark = watermark; + } + + @Override + public void setFontSize(int fontsize) { + // do nothing + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/CSVxml.java b/WEB-INF/src/com/dhtmlx/xml2excel/CSVxml.java new file mode 100644 index 0000000..34443d6 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/CSVxml.java @@ -0,0 +1,117 @@ +package com.dhtmlx.xml2excel; +import java.io.IOException; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class CSVxml { + private Document dom; + private String profile; + private NodeList header; + private NodeList rows; + private NodeList footer; + private int headerPos; + private int footerPos; + private int rowsPos; + private void parseXmlString(String xml_string){ + //get the factory + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + try { + //Using factory get an instance of document builder + DocumentBuilder db = dbf.newDocumentBuilder(); + + //parse using builder to get DOM representation of the XML file + StringReader reader = new StringReader(xml_string); + InputSource inputSource = new InputSource(reader); + inputSource.setEncoding("UTF-8"); + dom = db.parse(inputSource); + reader.close(); + + profile = dom.getDocumentElement().getAttribute("profile"); + if (profile == null) profile = "color"; + + header = dom.getElementsByTagName("head"); + if (header.getLength()>0){ + header = header.item(0).getChildNodes(); + header = removeSettings(header); + } + headerPos = 0; + + footer = dom.getElementsByTagName("foot"); + if (footer.getLength()>0){ + footer = footer.item(0).getChildNodes(); + footer = removeSettings(footer); + } + footerPos = 0; + + rows = dom.getElementsByTagName("row"); + rowsPos = 0; + + }catch(ParserConfigurationException pce) { + pce.printStackTrace(); + }catch(SAXException se) { + se.printStackTrace(); + }catch(IOException ioe) { + ioe.printStackTrace(); + } + } + + public CSVxml(String xml) { + parseXmlString(xml); + } + + private String[] getDataArray(Node node){ + NodeList columns = node.getChildNodes(); + String[] data = new String[columns.getLength()]; + for (int i=columns.getLength()-1; i>=0; i--) + data[i] = columns.item(i).getTextContent(); + + return data; + } + public String[] getHeader(){ + if (header==null || header.getLength() <= headerPos) return null; + Node node = header.item(headerPos); + headerPos += 1; + + return getDataArray(node); + } + public String[] getFooter(){ + if (footer == null || footer.getLength() <= footerPos) return null; + Node node = footer.item(footerPos); + footerPos += 1; + + return getDataArray(node); + } + public String[] getRow(){ + if (rows == null || rows.getLength() <= rowsPos) return null; + Node node = rows.item(rowsPos); + rowsPos += 1; + + return getDataArray(node); + } + + private NodeList removeSettings(NodeList header) { + // remove settings sections + for (int i = 0; i < header.getLength(); i++) { + NodeList childs = header.item(i).getChildNodes(); + for (int j = 0; j < childs.getLength(); j++) { + if (childs.item(j).getNodeType() == 3 || childs.item(j).getNodeName().equals("settings")) + header.item(i).removeChild(childs.item(j)); + } + } + return header; + } + + public String getProfile() { + return profile; + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/Colors.java b/WEB-INF/src/com/dhtmlx/xml2excel/Colors.java new file mode 100644 index 0000000..dcebe22 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/Colors.java @@ -0,0 +1,43 @@ +package com.dhtmlx.xml2excel; + +public class Colors { + + public String bgColor = "D1E5FE"; + public String lineColor = "A4BED4"; + public String headerTextColor = "000000"; + public String scaleOneColor = "FFFFFF"; + public String scaleTwoColor = "E3EFFF"; + public String gridTextColor = "000000"; + public String watermarkTextColor = "8b8b8b"; + + + public void setColorProfile(String profile) { + if ((profile.equalsIgnoreCase("color"))||profile.equalsIgnoreCase("full_color")) { + bgColor = "D1E5FE"; + lineColor = "A4BED4"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "E3EFFF"; + gridTextColor = "000000"; + watermarkTextColor = "8b8b8b"; + } else { + if (profile.equalsIgnoreCase("gray")) { + bgColor = "E3E3E3"; + lineColor = "B8B8B8"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "EDEDED"; + gridTextColor = "000000"; + watermarkTextColor = "8b8b8b"; + } else { + bgColor = "FFFFFF"; + lineColor = "000000"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "FFFFFF"; + gridTextColor = "000000"; + watermarkTextColor = "000000"; + } + } + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelCell.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelCell.java new file mode 100644 index 0000000..a53d926 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelCell.java @@ -0,0 +1,56 @@ +package com.dhtmlx.xml2excel; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public class ExcelCell { + + private String value = ""; + private String bgColor = ""; + private String textColor = ""; + private String bold = ""; + private String italic = ""; + private String align = ""; + + public void parse(Node parent) { + //(REV)we may have empty cell, which will return null for getFirstChild + value = parent.getFirstChild().getNodeValue(); + Element el = (Element) parent; + bgColor = (el.hasAttribute("bgColor")) ? el.getAttribute("bgColor") : ""; + textColor = (el.hasAttribute("textColor")) ? el.getAttribute("textColor") : ""; + bold = (el.hasAttribute("bold")) ? el.getAttribute("bold") : ""; + italic = (el.hasAttribute("italic")) ? el.getAttribute("italic") : ""; + align = (el.hasAttribute("align")) ? el.getAttribute("align") : ""; + } + + public String getValue() { + return value; + } + + public String getBgColor() { + return bgColor; + } + + public String getTextColor() { + return textColor; + } + + public Boolean getBold() { //(REV)why we store string , and not boolean? + if (bold.equals("bold")) + return true; + else + return false; + } + + public Boolean getItalic() { //(REV)why we store string , and not boolean? + if (italic.equals("italic")) + return true; + else + return false; + } + + public String getAlign() { + return align; + } + +}
\ No newline at end of file diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelColumn.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelColumn.java new file mode 100644 index 0000000..0d1f9f9 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelColumn.java @@ -0,0 +1,80 @@ +package com.dhtmlx.xml2excel; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public class ExcelColumn { + + private String colName; + private String type; + private String align; + private int colspan; + private int rowspan; + private int width = 0; + private int height = 1; + private boolean is_footer = false; + + public void parse(Element parent) { + is_footer = parent.getParentNode().getParentNode().getNodeName().equals("foot"); + + Node text_node = parent.getFirstChild(); + if (text_node != null) + colName = text_node.getNodeValue(); + else + colName = ""; + + String width_string = parent.getAttribute("width"); + if (width_string.length() > 0) { + width = Integer.parseInt(width_string); + } + type = parent.getAttribute("type"); + align = parent.getAttribute("align"); + String colspan_string = parent.getAttribute("colspan"); + if (colspan_string.length() > 0) { + colspan = Integer.parseInt(colspan_string); + } + String rowspan_string = parent.getAttribute("rowspan"); + if (rowspan_string.length() > 0) { + rowspan= Integer.parseInt(rowspan_string); + } + } + + public int getWidth() { + return width; + } + + public boolean isFooter(){ + return is_footer; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getColspan() { + return colspan; + } + + public int getRowspan() { + return rowspan; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public String getName() { + return colName; + } + + public String getAlign() { + return align; + } + + public String getType() { + return type; + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelGenerator.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelGenerator.java new file mode 100644 index 0000000..d55bb76 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelGenerator.java @@ -0,0 +1,16 @@ +package com.dhtmlx.xml2excel; +import java.io.IOException; +import java.net.URLDecoder; +import javax.servlet.http.*; + + +@SuppressWarnings("serial") +public class ExcelGenerator extends HttpServlet { + private String mode = "csv"; + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String xml = req.getParameter("grid_xml"); + xml = URLDecoder.decode(xml, "UTF-8"); + (new ExcelWriter()).generate(xml, resp); + } + +}
\ No newline at end of file diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelRow.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelRow.java new file mode 100644 index 0000000..bd3d0bc --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelRow.java @@ -0,0 +1,39 @@ +package com.dhtmlx.xml2excel; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + +public class ExcelRow { + + private ExcelCell[] cells; + private int level = 0; + + public void parse(Node parent) { + Element el = (Element) parent; + String l = el.getAttribute("level"); + if (l != null && !l.equals("")) level = Integer.parseInt(l); + NodeList nodes = ((Element) parent).getElementsByTagName("cell"); + Node text_node; + if ((nodes != null)&&(nodes.getLength() > 0)) { + //(REV) do we really need them? + cells = new ExcelCell[nodes.getLength()]; + for (int i = 0; i < nodes.getLength(); i++) { + text_node = nodes.item(i); + ExcelCell cell = new ExcelCell(); + if (text_node != null) + cell.parse(text_node); + cells[i] = cell; + } + } + } + + public ExcelCell[] getCells() { + return cells; + } + + public int getLevel() { + return level; + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelWriter.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelWriter.java new file mode 100644 index 0000000..ae979d4 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelWriter.java @@ -0,0 +1,327 @@ +package com.dhtmlx.xml2excel; +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + + +import jxl.Workbook; +import jxl.format.Alignment; +import jxl.format.Border; +import jxl.format.BorderLineStyle; +import jxl.format.Colour; +import jxl.format.VerticalAlignment; +import jxl.write.*; +import jxl.write.Number; +import jxl.write.biff.*; + + +public class ExcelWriter extends BaseWriter { + private WritableWorkbook wb; + private WritableSheet sheet; + private ExcelColumn[][] cols; + private int colsNumber = 0; + private ExcelXmlParser parser; + + public int headerOffset = 0; + public int scale = 6; + public String pathToImgs = "";//optional, physical path + public int fontSize = 10; + + String bgColor = ""; + String lineColor = ""; + String headerTextColor = ""; + String scaleOneColor = ""; + String scaleTwoColor = ""; + String gridTextColor = ""; + String watermarkTextColor = ""; + + private int cols_stat; + private int rows_stat; + RGBColor colors; + private String watermark = null; + + public void generate(String xml, HttpServletResponse resp){ + parser = new ExcelXmlParser(); + try { + parser.setXML(xml); + createExcel(resp); + setColorProfile(); + headerPrint(parser); + rowsPrint(parser,resp); + footerPrint(parser); + insertHeader(parser,resp); + insertFooter(parser,resp); + watermarkPrint(parser); + outputExcel(resp); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private void createExcel(HttpServletResponse resp) throws IOException { + /* Save generated excel to file. + * Can be useful for debug output. + * */ + /* + FileOutputStream fos = new FileOutputStream("d:/test.xls"); + wb = Workbook.createWorkbook(fos); + */ + wb = Workbook.createWorkbook(resp.getOutputStream()); + sheet = wb.createSheet("First Sheet", 0); + colors = new RGBColor(); + } + + private void outputExcel(HttpServletResponse resp) throws IOException, WriteException { + resp.setContentType("application/vnd.ms-excel"); + resp.setCharacterEncoding("UTF-8"); + resp.setHeader("Content-Disposition", "attachment;filename=grid.xls"); + resp.setHeader("Cache-Control", "max-age=0"); + wb.write(); + wb.close(); + } + + private void headerPrint(ExcelXmlParser parser) throws RowsExceededException, WriteException, IOException { + cols = parser.getColumnsInfo("head"); + + int widths[] = parser.getWidths(); + this.cols_stat = widths.length; + + int sumWidth = 0; + for (int i = 0; i < widths.length; i++) { + sumWidth += widths[i]; + } + if (parser.getWithoutHeader() == false) { + for (int i = 0; i < cols.length; i++) { + sheet.setRowView(i, 450); + sheet.getSettings().setVerticalFreeze(i + 1); + for (int j = 0; j < cols[i].length; j++) { + sheet.setColumnView(j, widths[j]/scale); + WritableFont font = new WritableFont(WritableFont.ARIAL, fontSize - 1, WritableFont.BOLD); + font.setColour(colors.getColor(headerTextColor, wb)); + WritableCellFormat f = new WritableCellFormat (font); + f.setBackground(colors.getColor(bgColor, wb)); + f.setBorder(Border.ALL, BorderLineStyle.THIN, colors.getColor(lineColor, wb)); + f.setVerticalAlignment(VerticalAlignment.CENTRE); + + f.setAlignment(Alignment.CENTRE); + String name = cols[i][j].getName(); + Label label = new Label(j, i, name, f); + sheet.addCell(label); + colsNumber = j; + } + } + headerOffset = cols.length; + for (int i = 0; i < cols.length; i++) { + for (int j = 0; j < cols[i].length; j++) { + int cspan = cols[i][j].getColspan(); + if (cspan > 0) { + sheet.mergeCells(j, i, j + cspan - 1, i); + } + int rspan = cols[i][j].getRowspan(); + if (rspan > 0) { + sheet.mergeCells(j, i, j, i + rspan - 1); + } + } + } + } + } + + private void footerPrint(ExcelXmlParser parser) throws RowsExceededException, WriteException, IOException { + cols = parser.getColumnsInfo("foot"); + if (cols == null) return; + if (parser.getWithoutHeader() == false) { + for (int i = 0; i < cols.length; i++) { + sheet.setRowView(i + headerOffset, 450); + for (int j = 0; j < cols[i].length; j++) { + WritableFont font = new WritableFont(WritableFont.ARIAL, fontSize, WritableFont.BOLD); + font.setColour(colors.getColor(headerTextColor, wb)); + WritableCellFormat f = new WritableCellFormat (font); + f.setBackground(colors.getColor(bgColor, wb)); + f.setBorder(Border.ALL, BorderLineStyle.THIN, colors.getColor(lineColor, wb)); + f.setVerticalAlignment(VerticalAlignment.CENTRE); + + f.setAlignment(Alignment.CENTRE); + String name = cols[i][j].getName(); + Label label = new Label(j, i + headerOffset, name, f); + sheet.addCell(label); + } + } + for (int i = 0; i < cols.length; i++) { + for (int j = 0; j < cols[i].length; j++) { + int cspan = cols[i][j].getColspan(); + if (cspan > 0) { + sheet.mergeCells(j, headerOffset + i, j + cspan - 1, headerOffset + i); + } + int rspan = cols[i][j].getRowspan(); + if (rspan > 0) { + sheet.mergeCells(j, headerOffset + i, j, headerOffset + i + rspan - 1); + } + } + } + } + headerOffset += cols.length; + } + + private void watermarkPrint(ExcelXmlParser parser) throws WriteException { + if (watermark == null) return; + + WritableFont font = new WritableFont(WritableFont.ARIAL, fontSize, WritableFont.BOLD); + font.setColour(colors.getColor(watermarkTextColor, wb)); + WritableCellFormat f = new WritableCellFormat (font); + f.setBorder(Border.ALL, BorderLineStyle.THIN, colors.getColor(lineColor, wb)); + f.setVerticalAlignment(VerticalAlignment.CENTRE); + + f.setAlignment(Alignment.CENTRE); + Label label = new Label(0, headerOffset, watermark , f); + sheet.addCell(label); + sheet.mergeCells(0, headerOffset, colsNumber, headerOffset); + } + + private void rowsPrint(ExcelXmlParser parser, HttpServletResponse resp) throws WriteException, IOException { + //do we really need them? + ExcelRow[] rows = parser.getGridContent(); + if (rows == null) return; + this.rows_stat = rows.length; + + for (int i = 0; i < rows.length; i++) { + ExcelCell[] cells = rows[i].getCells(); + sheet.setRowView(i + headerOffset, 400); + for (int j = 0; j < cells.length; j++) { + // sets cell font + WritableFont font = new WritableFont(WritableFont.ARIAL, fontSize, (cells[j].getBold()) ? WritableFont.BOLD : WritableFont.NO_BOLD, (cells[j].getItalic()) ? true : false); + if ((!cells[j].getTextColor().equals(""))&&(parser.getProfile().equals("full_color"))) + font.setColour(colors.getColor(cells[j].getTextColor(), wb)); + else + font.setColour(colors.getColor(gridTextColor, wb)); + WritableCellFormat f = new WritableCellFormat (font); + + // sets cell background color + if ((!cells[j].getBgColor().equals(""))&&(parser.getProfile().equals("full_color"))) { + Colour col = colors.getColor(cells[j].getBgColor(), wb); + f.setBackground(col); + } else { + Colour bg; + if (i%2 == 1) { + bg = colors.getColor(scaleTwoColor, wb); + + } else { + bg = colors.getColor(scaleOneColor, wb); + } + f.setBackground(bg); + } + + f.setBorder(Border.ALL, BorderLineStyle.THIN, colors.getColor(lineColor, wb)); + f.setVerticalAlignment(VerticalAlignment.CENTRE); + if (cols[0][j].getType().equals("tree")) + f.setIndentation(rows[i].getLevel()*2); + + String al = cells[j].getAlign(); + if (al == "") + al = cols[0][j].getAlign(); + if (al.equalsIgnoreCase("left")) { + f.setAlignment(Alignment.LEFT); + } else { + if (al.equalsIgnoreCase("right")) { + f.setAlignment(Alignment.RIGHT); + } else { + f.setAlignment(Alignment.CENTRE); + } + } + String text = cells[j].getValue(); + String type = cols[0][j].getType(); + if (type.equals("number") || type.equals("num") || + type.equals("edn") || type.equals("ron")) { + text = text.replaceAll("[^\\d\\.-]", ""); + print_number(j, i + headerOffset, text, f); + } else { + print_string(j, i + headerOffset, text, f); + } + } + } + headerOffset += rows.length; + } + + private void print_number(int column, int row, String text, WritableCellFormat f) throws RowsExceededException, WriteException { + try { + text = text.replace(",", "."); + double value = Double.parseDouble(text); + Number label = new Number(column, row, value, f); + sheet.addCell(label); + } catch (Exception e) { + print_string(column, row, text, f); + } + } + + private void print_string(int column, int row, String value, WritableCellFormat f) throws RowsExceededException, WriteException { + Label label = new Label(column, row, value, f); + sheet.addCell(label); + } + + private void insertHeader(ExcelXmlParser parser, HttpServletResponse resp) throws IOException, RowsExceededException { + if (parser.getHeader() == true) { + sheet.insertRow(0); + sheet.setRowView(0, 5000); + File imgFile = new File(pathToImgs + "/header.png"); + WritableImage img = new WritableImage(0, 0, cols[0].length, 1, imgFile); + sheet.addImage(img); + headerOffset++; + } + } + + private void insertFooter(ExcelXmlParser parser, HttpServletResponse resp) throws IOException, RowsExceededException { + if (parser.getFooter() == true) { + sheet.setRowView(headerOffset, 5000); + File imgFile = new File(pathToImgs + "/footer.png"); + WritableImage img = new WritableImage(0, headerOffset, cols[0].length, 1, imgFile); + sheet.addImage(img); + } + } + + public int getColsStat() { + return this.cols_stat; + } + + public int getRowsStat() { + return this.rows_stat; + } + + private void setColorProfile() { + String profile = parser.getProfile(); + if ((profile.equalsIgnoreCase("color"))||profile.equalsIgnoreCase("full_color")) { + bgColor = "D1E5FE"; + lineColor = "A4BED4"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "E3EFFF"; + gridTextColor = "000000"; + watermarkTextColor = "8b8b8b"; + } else { + if (profile.equalsIgnoreCase("gray")) { + bgColor = "E3E3E3"; + lineColor = "B8B8B8"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "EDEDED"; + gridTextColor = "000000"; + watermarkTextColor = "8b8b8b"; + } else { + bgColor = "FFFFFF"; + lineColor = "000000"; + headerTextColor = "000000"; + scaleOneColor = "FFFFFF"; + scaleTwoColor = "FFFFFF"; + gridTextColor = "000000"; + watermarkTextColor = "000000"; + } + } + } + + public void setWatermark(String mark) { + watermark = mark; + } + + public void setFontSize(int fontsize) { + this.fontSize = fontsize; + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/ExcelXmlParser.java b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelXmlParser.java new file mode 100644 index 0000000..6f68aca --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/ExcelXmlParser.java @@ -0,0 +1,161 @@ +package com.dhtmlx.xml2excel; +import java.io.*; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.*; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class ExcelXmlParser { + private Element root; + private ExcelRow[] rows; + private int[] widths; + private Boolean header = false; + private Boolean footer = false; + private Boolean without_header = false; + private String profile = "gray"; + + public void setXML(String xml) + throws IOException, DOMException, ParserConfigurationException, SAXException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance (); + DocumentBuilder db = dbf.newDocumentBuilder(); + + Document dom = null; + try { + dom = db.parse(new InputSource(new StringReader(xml))); + }catch(SAXException se) { + se.printStackTrace(); + }catch(IOException ioe) { + ioe.printStackTrace(); + } + root = dom.getDocumentElement(); + + String header_text = root.getAttribute("header"); + if ((header_text != null)&&(header_text.equalsIgnoreCase("true") == true)) { + header = true; + } + String footer_text = root.getAttribute("footer"); + if ((footer_text != null)&&(footer_text.equalsIgnoreCase("true") == true)) { + footer = true; + } + String profile_text = root.getAttribute("profile"); + if (profile_text != null) { + profile = profile_text; + } + String w_header = root.getAttribute("without_header"); + if ((w_header != null)&&(w_header.equalsIgnoreCase("true") == true)) + without_header = true; + } + + public ExcelColumn[][] getColumnsInfo(String mode) { + ExcelColumn[] colLine = null; + ExcelColumn[][] columns = null; + + XPathFactory xpathFactory = XPathFactory.newInstance(); + XPath xpath = xpathFactory.newXPath(); + try { + String path = "/rows/".concat(mode).concat("/columns"); + NodeList n1 = (NodeList) xpath.evaluate(path, root, + XPathConstants.NODESET); + + if ((n1 != null)&&(n1.getLength() > 0)) { + + columns = new ExcelColumn[n1.getLength()][]; + for (int i = 0; i < n1.getLength(); i++) { + Element cols = (Element) n1.item(i); + NodeList n2 = cols.getElementsByTagName("column"); + if ((n2 != null)&&(n2.getLength() > 0)) { + colLine = new ExcelColumn[n2.getLength()]; + for (int j = 0; j < n2.getLength(); j++) { + Element col_xml = (Element) n2.item(j); + ExcelColumn col = new ExcelColumn(); + col.parse(col_xml); + colLine[j] = col; + } + } + columns[i] = colLine; + } + } else { + return null; + } + } catch (XPathExpressionException e) { + e.printStackTrace(); + } + + createWidthsArray(columns); + columns = optimizeColumns(columns); + return columns; + } + + private void createWidthsArray(ExcelColumn[][] columns) { + widths = new int[columns[0].length]; + for (int i = 0; i < columns[0].length; i++) { + widths[i] = columns[0][i].getWidth(); + } + } + + private ExcelColumn[][] optimizeColumns(ExcelColumn[][] columns) { + for (int i = 1; i < columns.length; i++) { + for (int j = 0; j < columns[i].length; j++) { + columns[i][j].setWidth(columns[0][j].getWidth()); + } + } + for (int i = 0; i < columns.length; i++) { + for (int j = 0; j < columns[i].length; j++) { + if (columns[i][j].getColspan() > 0) { + for (int k = j + 1; k < j + columns[i][j].getColspan(); k++) { + columns[i][j].setWidth(columns[i][j].getWidth() + columns[i][k].getWidth()); + columns[i][k].setWidth(0); + } + } + if (columns[i][j].getRowspan() > 0) { + for (int k = i + 1; k < i + columns[i][j].getRowspan() && k < columns.length; k++) { + columns[i][j].setHeight(columns[i][j].getHeight() + 1); + columns[k][j].setHeight(0); + } + } + } + } + return columns; + } + + public ExcelRow[] getGridContent() { + NodeList nodes = root.getElementsByTagName("row"); + if ((nodes != null)&&(nodes.getLength() > 0)) { + rows = new ExcelRow[nodes.getLength()]; + for (int i = 0; i < nodes.getLength(); i++) { + rows[i] = new ExcelRow(); + rows[i].parse(nodes.item(i)); + } + } + return rows; + } + + public int[] getWidths() { + return widths; + } + + public boolean getHeader() { + return header; + } + + public Boolean getFooter() { + return footer; + } + + public String getProfile() { + return profile; + } + + public boolean getWithoutHeader() { + return without_header; + } + +}
\ No newline at end of file diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/HTMLWriter.java b/WEB-INF/src/com/dhtmlx/xml2excel/HTMLWriter.java new file mode 100644 index 0000000..f2a59dc --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/HTMLWriter.java @@ -0,0 +1,129 @@ +package com.dhtmlx.xml2excel; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletResponse; + +public class HTMLWriter extends BaseWriter{ + int rows = 0; + int cols = 0; + int fontSize = -1; + String watermark = null; + + public void generate(String xml, HttpServletResponse resp) throws IOException { + CSVxml data = new CSVxml(xml); + + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("application/vnd.ms-excel"); + resp.setCharacterEncoding("UTF-8"); + resp.setHeader("Content-Disposition", "attachment;filename=grid.xls"); + resp.setHeader("Cache-Control", "max-age=0"); + + String[] csv; + int colsnum = 0; + PrintWriter writer = resp.getWriter(); + + Colors colors = getColors(data); + startHTML(writer, colors); + csv = data.getHeader(); + if (csv != null)colsnum = csv.length; + while(csv != null){ + writer.append(dataAsString(csv, "header")); + csv = data.getHeader(); + } + + csv = data.getRow(); + if (csv != null){ + colsnum = csv.length; + cols = csv.length; + } + while(csv != null){ + String className = rows%2 == 0 ? "cell_odd" : "cell_even"; + writer.append(dataAsString(csv, className)); + csv = data.getRow(); + rows +=1; + writer.flush(); + } + + csv = data.getFooter(); + if (csv != null)colsnum = csv.length; + while(csv != null){ + writer.append(dataAsString(csv, "footer")); + writer.flush(); + csv = data.getFooter(); + } + drawWatermark(writer, colsnum); + endHTML(writer); + + writer.flush(); + writer.close(); + } + + private void drawWatermark(PrintWriter writer, int colsnum) { + if (watermark != null) + writer.append("<tr><td colspan='" + colsnum + "'>" + watermark + "</td></tr>"); + } + + private void endHTML(PrintWriter writer) { + writer.append("</table></body></html>"); + } + + private void startHTML(PrintWriter writer, Colors colors) { + writer.append("<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><body>"); + writer.append("<style>"); + + String fontsize = (fontSize == -1) ? "" : "font-size: " + fontSize + "pt"; + String header_css = "background-color: #" + colors.bgColor + "; border:.5pt solid #" + colors.lineColor + ";" + fontsize; + String cell_odd_css = "background-color: #" + colors.scaleOneColor + "; border:.5pt solid #" + colors.lineColor + ";" + fontsize; + String cell_even_css = "background-color: #" + colors.scaleTwoColor + "; border:.5pt solid #" + colors.lineColor + ";" + fontsize; + String footer_css = "background-color: #" + colors.bgColor + "; border:.5pt solid #" + colors.lineColor + ";" + fontsize; + + writer.append(".header { height: 30pt; vertical-align: middle; text-align: center; " + header_css + " }"); + writer.append(".cell_odd { height: 20pt; vertical-align: middle; " + cell_odd_css + " }"); + writer.append(".cell_even { height: 20pt; vertical-align: middle; " + cell_even_css + "}"); + writer.append(".footer { height: 30pt; vertical-align: middle; text-align: center; " + footer_css + " }"); + writer.append("</style>"); + if (fontSize != -1) + writer.append("<style>.format { font-size: " + fontSize + "pt; }</style>"); + writer.append("<table>"); + } + + + private String dataAsString(String[] csv, String className) { + if (csv.length == 0) return ""; + + StringBuffer buff = new StringBuffer(); + buff.append("<tr>"); + for ( int i=0; i<csv.length; i++){ + buff.append("<td class=\"" + className + "\">"); + buff.append(csv[i].replace("&", "&").replace(">", ">").replace("<", "<")); + buff.append("</td>"); + } + buff.append("</tr>\n"); + return buff.toString(); + } + + public int getColsStat() { + return cols; + } + + public int getRowsStat() { + return rows; + } + + public void setFontSize(int fontsize) { + this.fontSize = fontsize; + } + + public void setWatermark(String watermark) { + this.watermark = watermark; + } + + private Colors getColors(CSVxml data) { + String profile = data.getProfile(); + Colors colors = new Colors(); + colors.setColorProfile(profile); + return colors; + } +} diff --git a/WEB-INF/src/com/dhtmlx/xml2excel/RGBColor.java b/WEB-INF/src/com/dhtmlx/xml2excel/RGBColor.java new file mode 100644 index 0000000..7af3429 --- /dev/null +++ b/WEB-INF/src/com/dhtmlx/xml2excel/RGBColor.java @@ -0,0 +1,75 @@ +package com.dhtmlx.xml2excel; + +import java.util.Hashtable; +import java.util.regex.*; + +import jxl.format.Colour; +import jxl.write.WritableWorkbook; + +public class RGBColor { + int colorCounter = 63; + Hashtable<String, Colour> parsedColors = new Hashtable<String, Colour>(); + + public Colour getColor(String color, WritableWorkbook wb) { + int[] result; + String original = color; + if (!parsedColors.containsKey(color)) { + color = processColorForm(color); + result = new int[3]; + String r = color.substring(0, 2); + String g = color.substring(2, 4); + String b = color.substring(4, 6); + result[0] = Integer.parseInt(r, 16); + result[1] = Integer.parseInt(g, 16); + result[2] = Integer.parseInt(b, 16); + + Colour col = new Colour(colorCounter, "custom", result[0], result[1], result[2]); + wb.setColourRGB(col, (int) result[0], (int) result[1], (int) result[2]); + parsedColors.put(original, col); + + colorCounter--; + if (colorCounter<32) colorCounter=63; + + return col; + } else { + return parsedColors.get(color); + } + } + + public String processColorForm(String color) { + if (color.equals("transparent")) { + return ""; + } + + Pattern p1 = Pattern.compile("#[0-9A-Fa-f]{6}"); + Matcher m1 = p1.matcher(color); + if (m1.matches()) { + return color.substring(1); + } + + Pattern p2 = Pattern.compile("[0-9A-Fa-f]{6}"); + Matcher m2 = p2.matcher(color); + if (m2.matches()) { + return color; + } + + Pattern p3 = Pattern.compile("rgb\\s?\\(\\s?(\\d{1,3})\\s?,\\s?(\\d{1,3})\\s?,\\s?(\\d{1,3})\\s?\\)"); + Matcher m3 = p3.matcher(color); + + if (m3.matches()) { + color = ""; + String r = m3.group(1); + String g = m3.group(2); + String b = m3.group(3); + r = Integer.toHexString(Integer.parseInt(r)); + r = (r.length() == 1) ? "0" + r : r; + g = Integer.toHexString(Integer.parseInt(g)); + g = (g.length() == 1) ? "0" + g : g; + b = Integer.toHexString(Integer.parseInt(b)); + b = (b.length() == 1) ? "0" + b : b; + color = r + g + b; + return color; + } + return ""; + } +}
\ No newline at end of file diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml new file mode 100644 index 0000000..d3d2d3e --- /dev/null +++ b/WEB-INF/web.xml @@ -0,0 +1,31 @@ +<!DOCTYPE web-app PUBLIC + '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' + 'http://java.sun.com/dtd/web-app_2_3.dtd'> +<web-app> + <servlet> + <servlet-name>ExcelGenerator</servlet-name> + <servlet-class>ExcelGenerator</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>ExcelGenerator</servlet-name> + <url-pattern>/generate</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>CSVGenerator</servlet-name> + <servlet-class>CSVGenerator</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>CSVGenerator</servlet-name> + <url-pattern>/csv</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>HTMLGenerator</servlet-name> + <servlet-class>HTMLGenerator</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>HTMLGenerator</servlet-name> + <url-pattern>/html</url-pattern> + </servlet-mapping> +</web-app>
\ No newline at end of file |