All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sta.cts.hssf.HSSFHandlerXLS2XML Maven / Gradle / Ivy


package com.sta.cts.hssf;

import java.io.IOException;
import java.io.FileInputStream;

import java.util.Vector;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.Region;

import com.sta.mlogger.MLogger;

import com.sta.cts.XMLGenerator;
import com.sta.cts.UniTypeConv;

/**
 * 

Name: HSSFHandlerXLS2XML

*

Description: Spezieller Handler. *

*

Copyright: Copyright (c) 2003, 2016, 2017, 2019

*

Company: >StA-Soft<

* @author StA * @version 1.0 */ public class HSSFHandlerXLS2XML { /** * Input-Stream. */ private FileInputStream in; /** * HSSF-Workbook. */ private HSSFWorkbook wb; /** * XML-Generator. */ private XMLGenerator xg; /** * Bereiche. */ private Vector myMergedRegions = new Vector(); //=========================================================================== /** * Merged-Regions vorbereiten. * @param sheet Sheet */ private void prepareMergedRegions(HSSFSheet sheet) { myMergedRegions.clear(); try { int cnt = sheet.getNumMergedRegions(); for (int i = 0; i < cnt; i++) { Region mr = sheet.getMergedRegionAt(i); if (mr != null) { myMergedRegions.add(mr); } } } catch (Exception e) { } } /** * Merged-Region finden. * @param line Zeile * @param col Spalte * @return Region */ private Region findMergedRegion(int line, short col) { int cnt = myMergedRegions.size(); for (int i = 0; i < cnt; i++) { Region mr = (Region) myMergedRegions.get(i); if (mr.contains(line, col)) { return mr; } } return null; } //--------------------------------------------------------------------------- /** * Hex-Darstellung (2stellig) f?r Integer. * @param i Integer * @return Hex-Darstellung */ private String hex(int i) { String s = Integer.toHexString(i); if (s.length() < 2) { s = "0" + s; } return s; } /** * Zur?ck-Konvertierung f?r Farbe. * @param name Name * @param color Farbe * @throws IOException im Fehlerfall */ private void reconvColor(String name, short color) throws IOException { for (int i = 0; i < HSSF.COLORS.length; i++) { short[] ci = HSSF.COLORS[i]; if (color == ci[0]) { xg.putAttr(name, "$" + hex(ci[HSSF.RED]) + hex(ci[HSSF.GREEN]) + hex(ci[HSSF.BLUE])); break; } } } /** * Zur?ck-Konvertierung f?r Short-Wert. * @param name Name * @param sa Werte-Feld * @param v Index in Werte-Feld * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvShort(String name, String[] sa, short v, short std) throws IOException { if (v != std) { xg.putAttr(name, sa[v]); } } /** * Zur?ck-Konvertierung f?r Short-Wert. * @param name Name * @param sa Werte-Feld * @param va Index-Feld * @param v Index aus Index-Feld * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvShort(String name, String[] sa, short[] va, short v, short std) throws IOException { for (int i = 0; i < va.length; i++) { if (v == va[i]) { if (v != std) { xg.putAttr(name, sa[i]); } break; } } } /** * Zur?ck-Konvertierung f?r Boolean-Wert. * @param name Name * @param v Wert * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvBoolean(String name, boolean v, boolean std) throws IOException { if (v != std) { xg.putAttr(name, HSSF.BOOLEANS[v ? 1 : 0]); } } /** * Zur?ck-Konvertierung f?r Integer-Wert. * @param name Name * @param v Wert * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvInteger(String name, int v, int std) throws IOException { if (v != std) { xg.putAttr(name, "" + v); } } /** * Zur?ck-Konvertierung f?r Float-Wert. * @param name Name * @param v Wert * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvFloat(String name, float v, float std) throws IOException { if (v != std) { xg.putAttr(name, "" + v); } } /** * Zur?ck-Konvertierung f?r String-Wert. * @param name Name * @param v Wert * @param std Standard-Wert * @throws IOException im Fehlerfall */ private void reconvString(String name, String v, String std) throws IOException { if (!v.equals(std)) { xg.putAttr(name, v); } } //--------------------------------------------------------------------------- /** * Zelle verarbeiten. * @param cell Zelle * @param cellspan Cell-Span * @param rowspan Row-Span * @throws IOException im Fehlerfall */ private void runCell(HSSFCell cell, int cellspan, int rowspan) throws IOException { int i; xg.openTag(HSSF.TAG_CELL); if (cell != null) { HSSFCellStyle cs = cell.getCellStyle(); if (cs != null) { HSSFFont font = wb.getFontAt(cs.getFontIndex()); if (font != null) { reconvString(HSSF.ATTR_FONT_NAME, font.getFontName(), HSSF.STD_FONT_NAME); reconvInteger(HSSF.ATTR_FONT_SIZE, font.getFontHeightInPoints(), HSSF.STD_FONT_SIZE); reconvColor(HSSF.ATTR_COLOR, font.getColor()); i = font.getBoldweight(); if (i > (HSSFFont.BOLDWEIGHT_BOLD + HSSFFont.BOLDWEIGHT_NORMAL) / 2) { xg.putAttr(HSSF.ATTR_FONT_WEIGHT, HSSF.FONT_WEIGHTS[1]); } if (font.getItalic()) { xg.putAttr(HSSF.ATTR_FONT_STYLE, HSSF.FONT_STYLES[1]); } if (font.getStrikeout()) { xg.putAttr(HSSF.ATTR_TEXT_DECO, HSSF.TEXT_DECOS[1]); } reconvShort(HSSF.ATTR_UNDERLINE, HSSF.UNDERLINES, HSSF.UNDERLINE_VALUES, font.getUnderline(), HSSF.STD_UNDERLINE); reconvShort(HSSF.ATTR_TYPE_OFFSET, HSSF.TYPE_OFFSETS, font.getTypeOffset(), HSSF.STD_TYPE_OFFSET); } reconvInteger(HSSF.ATTR_ROTATION, cs.getRotation(), HSSF.STD_ROTATION); reconvInteger(HSSF.ATTR_INDENT, cs.getIndention(), HSSF.STD_INDENT); i = cs.getFillPattern(); if (i != HSSFCellStyle.NO_FILL) { if (i == HSSFCellStyle.SOLID_FOREGROUND) { reconvColor(HSSF.ATTR_BG_COLOR, cs.getFillForegroundColor()); } else { reconvColor(HSSF.ATTR_FILL_BACKGROUND_COLOR, cs.getFillBackgroundColor()); reconvColor(HSSF.ATTR_FILL_FOREGROUND_COLOR, cs.getFillForegroundColor()); xg.putAttr(HSSF.ATTR_FILL_PATTERN, HSSF.FILL_PATTERNS[i]); } } reconvShort(HSSF.ATTR_BORDER_BOTTOM, HSSF.BORDERS, cs.getBorderBottom(), HSSFCellStyle.BORDER_NONE); reconvShort(HSSF.ATTR_BORDER_LEFT, HSSF.BORDERS, cs.getBorderLeft(), HSSFCellStyle.BORDER_NONE); reconvShort(HSSF.ATTR_BORDER_RIGHT, HSSF.BORDERS, cs.getBorderRight(), HSSFCellStyle.BORDER_NONE); reconvShort(HSSF.ATTR_BORDER_TOP, HSSF.BORDERS, cs.getBorderTop(), HSSFCellStyle.BORDER_NONE); reconvColor(HSSF.ATTR_BORDER_BOTTOM_COLOR, cs.getBottomBorderColor()); reconvColor(HSSF.ATTR_BORDER_LEFT_COLOR, cs.getLeftBorderColor()); reconvColor(HSSF.ATTR_BORDER_RIGHT_COLOR, cs.getRightBorderColor()); reconvColor(HSSF.ATTR_BORDER_TOP_COLOR, cs.getTopBorderColor()); reconvShort(HSSF.ATTR_ALIGN, HSSF.ALIGNMENTS, cs.getAlignment(), HSSFCellStyle.ALIGN_GENERAL); reconvShort(HSSF.ATTR_V_ALIGN, HSSF.VERTICALS, cs.getVerticalAlignment(), HSSFCellStyle.VERTICAL_TOP); reconvBoolean(HSSF.ATTR_WRAP, cs.getWrapText(), HSSF.STD_WRAP); reconvBoolean(HSSF.ATTR_HIDDEN, cs.getHidden(), HSSF.STD_HIDDEN); reconvBoolean(HSSF.ATTR_LOCKED, cs.getLocked(), HSSF.STD_LOCKED); } if (cellspan > 1) { xg.putAttr(HSSF.ATTR_CELL_SPAN, "" + cellspan); } if (rowspan > 1) { xg.putAttr(HSSF.ATTR_ROW_SPAN, "" + rowspan); } int ct = cell.getCellType(); switch (ct) { case HSSFCell.CELL_TYPE_STRING: { xg.putContent(cell.getStringCellValue()); break; } case HSSFCell.CELL_TYPE_NUMERIC: { // HSSF.println("numeric!"); xg.putAttr(HSSF.ATTR_CELL_TYPE, HSSF.CELL_TYPES[HSSFCell.CELL_TYPE_NUMERIC]); xg.putContent(UniTypeConv.convDouble2String(new Double(cell.getNumericCellValue()))); break; } default: { xg.putContent(cell.getStringCellValue()); } } } xg.closeTag(HSSF.TAG_CELL); } /** * Zeile verarbeiten. * @param row Zeile * @param line Zeilennummer * @throws IOException im Fehlerfall */ private void runRow(HSSFRow row, int line) throws IOException { xg.openTag(HSSF.TAG_ROW); if (row != null) { // "emptycells"... reconvFloat(HSSF.ATTR_ROW_HEIGHT, row.getHeightInPoints(), HSSF.STD_ROW_HEIGHT); // cells... int firstCell = row.getFirstCellNum(); int lastCell = row.getLastCellNum(); for (int col = 0; col < firstCell; col++) { xg.openTag(HSSF.TAG_CELL); xg.closeTag(HSSF.TAG_CELL); } for (int col = firstCell; col <= lastCell; col++) { // Pr?fen, ob die Zelle in einer MergedRegion liegt... Region mr = findMergedRegion(line, (short) col); // Handelt es sich um die erste Zelle in einer Zeile der Region, wird // cellspan entsprechend gesetzt und die folgenden Zellen ?bergangen int cellspan = 1; int rowspan = 1; if (mr != null) { if (mr.getColumnFrom() == col) { cellspan = mr.getColumnTo() - mr.getColumnFrom() + 1; } if (mr.getRowFrom() == line) { rowspan = mr.getRowTo() - mr.getRowFrom() + 1; } } runCell(row.getCell((short) col), cellspan, rowspan); col += cellspan - 1; } } xg.closeTag(HSSF.TAG_ROW); } /** * Sheet verarbeiten. * @param sheet Sheet * @param name Name * @throws IOException im Fehlerfall */ private void runSheet(HSSFSheet sheet, String name) throws IOException { prepareMergedRegions(sheet); xg.openTag(HSSF.TAG_SHEET); xg.putAttr(HSSF.ATTR_NAME, name); reconvBoolean(HSSF.ATTR_ALTERNATIVE_EXPRESSION, sheet.getAlternateExpression(), HSSF.STD_ALTERNATIVE_EXPRESSION); reconvBoolean(HSSF.ATTR_ALTERNATIVE_FORMULA, sheet.getAlternateFormula(), HSSF.STD_ALTERNATIVE_FORMULA); reconvBoolean(HSSF.ATTR_AUTO_BREAKS, sheet.getAutobreaks(), HSSF.STD_AUTO_BREAKS); reconvInteger(HSSF.ATTR_DEFAULT_COLUMN_WIDTH, sheet.getDefaultColumnWidth(), HSSF.STD_DEFAULT_COLUMN_WIDTH); reconvFloat(HSSF.ATTR_DEFAULT_ROW_HEIGHT, sheet.getDefaultRowHeightInPoints(), HSSF.STD_DEFAULT_ROW_HEIGHT); reconvBoolean(HSSF.ATTR_DIALOG, sheet.getDialog(), HSSF.STD_DIALOG); reconvBoolean(HSSF.ATTR_DISPLAY_GUTS, sheet.getDisplayGuts(), HSSF.STD_DISPLAY_GUTS); reconvBoolean(HSSF.ATTR_FIT_TO_PAGE, sheet.getFitToPage(), HSSF.STD_FIT_TO_PAGE); try { xg.putAttr(HSSF.ATTR_GRIDS_PRINTED, HSSF.BOOLEANS[sheet.isGridsPrinted() ? 1 : 0]); } catch (Exception e) { } reconvBoolean(HSSF.ATTR_ROW_SUMS_BELOW, sheet.getRowSumsBelow(), HSSF.STD_ROW_SUMS_BELOW); reconvBoolean(HSSF.ATTR_ROW_SUMS_RIGHT, sheet.getRowSumsRight(), HSSF.STD_ROW_SUMS_RIGHT); // "emptyrows" ... // cols... int curcol = 0; // Leider scheint es keine M?glichkeit zu geben, die maximale Anzahl von // Spalten auf einem Arbeitsblatt zu ermitteln ohne alle Zeilen abzufragen. // Zur Ermittlung der Spaltenbreite wird (HSSF-intern) ein Feld benutzt, // das leider "private" ist und ?ber keine Zugriffsmethode verf?gt. // Daher werden einfach mal die ersten 256 Spalten durchgegangen und eine // angegebene Spaltenbreite ?bernommen... int dcw = sheet.getDefaultColumnWidth(); for (int col = 0; col < 256; col++) { int colwidth = sheet.getColumnWidth((short) col); if (colwidth != dcw) { while (curcol < col) { xg.openTag(HSSF.TAG_COLUMN); xg.closeTag(HSSF.TAG_COLUMN); curcol++; } xg.openTag(HSSF.TAG_COLUMN); xg.putAttr(HSSF.ATTR_COLUMN_WIDTH, "" + colwidth / 256); xg.closeTag(HSSF.TAG_COLUMN); curcol++; } } // rows... int firstRow = sheet.getFirstRowNum(); int lastRow = sheet.getLastRowNum(); for (int line = 0; line < firstRow; line++) { xg.openTag(HSSF.TAG_ROW); xg.closeTag(HSSF.TAG_ROW); } for (int line = firstRow; line <= lastRow; line++) { runRow(sheet.getRow(line), line); } xg.closeTag(HSSF.TAG_SHEET); } /** * Workbook verarbeiten. * @param pDstFileName Zieldateiname * @throws IOException im Fehlerfall */ public void run(String pDstFileName) throws IOException { wb = new HSSFWorkbook(in); xg = new XMLGenerator(); xg.createXML(pDstFileName); xg.openTag(HSSF.TAG_WORKBOOK); int sheets = wb.getNumberOfSheets(); for (int i = 0; i < sheets; i++) { runSheet(wb.getSheetAt(i), wb.getSheetName(i)); } xg.closeTag(HSSF.TAG_WORKBOOK); xg.closeXML(); } //=========================================================================== /** * Zentraler Einstiegspunkt. * @param pSrcFileName Quelldateiname * @param pDstFileName Zieldateiname */ public static void main(String pSrcFileName, String pDstFileName) { try { HSSFHandlerXLS2XML aHSSFHandlerInstance = new HSSFHandlerXLS2XML(); aHSSFHandlerInstance.in = new FileInputStream(pSrcFileName); aHSSFHandlerInstance.run(pDstFileName); aHSSFHandlerInstance.in.close(); } catch (Exception ex) { MLogger.err("", ex); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy