summaryrefslogtreecommitdiffstats
path: root/WEB-INF/src
diff options
context:
space:
mode:
authorStanislav Wolski <stanislau.wolski@gmail.com>2017-03-29 09:06:23 +0300
committerStanislav Wolski <stanislau.wolski@gmail.com>2017-03-29 09:06:23 +0300
commit89d0bf924e9b8a4fc6782599fd80ec7c7798e016 (patch)
tree5fb3cecab5ca02801e4209634880d6fe85295cb6 /WEB-INF/src
downloadgrid-export-excel-java-master.zip
grid-export-excel-java-master.tar.gz
grid-export-excel-java-master.tar.bz2
Diffstat (limited to 'WEB-INF/src')
-rw-r--r--WEB-INF/src/CSVGenerator.java16
-rw-r--r--WEB-INF/src/ExcelGenerator.java19
-rw-r--r--WEB-INF/src/HTMLGenerator.java16
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/BaseWriter.java14
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/CSVWriter.java91
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/CSVxml.java117
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/Colors.java43
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelCell.java56
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelColumn.java80
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelGenerator.java16
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelRow.java39
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelWriter.java327
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/ExcelXmlParser.java161
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/HTMLWriter.java129
-rw-r--r--WEB-INF/src/com/dhtmlx/xml2excel/RGBColor.java75
15 files changed, 1199 insertions, 0 deletions
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("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;"));
+ 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