001: package com.calipso.reportgenerator.reportmanager;
002:
003: import com.calipso.reportgenerator.common.InfoException;
004: import com.calipso.reportgenerator.common.LanguageTraslator;
005:
006: /**
007: * Esta clase representa una posición en una planilla excel. Puede usarse para definir una direccion como C4 y traducirla
008: * a formato numerico fila / columna para ser usada con HSSF.
009: * User: jbassino
010: * Date: 28/10/2004
011: */
012: public class ExcelSheetPosition {
013:
014: //private char[] columns = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
015: private static final String columns = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
016:
017: private String columnName;
018: private int row;
019: private short column;
020:
021: /**
022: * Este constructor recibe un string como E8 y lo parsea para obtener una posicion que represente una fila columna.
023: * @param position
024: * @throws InfoException
025: */
026: public ExcelSheetPosition(String position) throws InfoException {
027: if (position == null || position.equalsIgnoreCase("")) {
028: throw new InfoException(LanguageTraslator.traslate("379"));
029: }
030: position = position.toUpperCase();
031: columnName = getLetters(position);
032: row = Integer.parseInt(getNumbers(position.substring(columnName
033: .length())));
034: column = getIndexFor(columnName);
035: }
036:
037: /**
038: * Este constructor recibe directamente como parametro la fila y columna, y no realiza ningún calculo.
039: * @param row
040: * @param column
041: */
042: public ExcelSheetPosition(int row, short column) {
043: this .row = row;
044: this .column = column;
045: }
046:
047: /**
048: * Recibe la columna por su nombre y la transforma a numero.
049: * @param columnName
050: * @param row
051: * @throws InfoException
052: */
053: public ExcelSheetPosition(String columnName, int row)
054: throws InfoException {
055: this .row = row;
056: this .columnName = columnName;
057: this .column = getIndexFor(columnName);
058: }
059:
060: /**
061: * Recibe un nombre de columna de 1 o 2 caracteres y obtiene la posicion que este representa en una hoja excel,
062: * empezando por A = 0.
063: * @param columnName
064: * @return
065: * @throws InfoException
066: */
067: private short getIndexFor(String columnName) throws InfoException {
068: if (columnName.length() == 1) {
069: return (short) columns.indexOf(columnName);
070: } else if (columnName.length() == 2) {
071: if (columns.indexOf(columnName.substring(0, 1)) < 10) {
072: return (short) (26 * (columns.indexOf(columnName
073: .substring(0, 1)) + 1) + columns
074: .indexOf(columnName.substring(1)));
075: }
076: }
077: throw new InfoException(LanguageTraslator.traslate("378")
078: + columnName);
079: }
080:
081: /**
082: * De un string obtiene la parte que son numeros. Ejemplo AB1024 retornara 1024.
083: * @param position
084: * @return
085: */
086: private String getNumbers(String position) {
087: StringBuffer buffer = new StringBuffer();
088: for (int i = 0; i < position.length(); i++) {
089: if (Character.isDigit(position.charAt(i))) {
090: buffer.append(position.charAt(i));
091: } else {
092: break;
093: }
094: }
095: return buffer.toString();
096: }
097:
098: /**
099: * De un string obtiene la primera parte con letras. Ejemplo AB1024 retorna AB
100: * @param position
101: * @return
102: */
103: private String getLetters(String position) {
104: StringBuffer buffer = new StringBuffer();
105: for (int i = 0; i < position.length(); i++) {
106: if (Character.isLetter(position.charAt(i))) {
107: buffer.append(position.charAt(i));
108: } else {
109: break;
110: }
111: }
112: return buffer.toString();
113: }
114:
115: public int getRow() {
116: return row;
117: }
118:
119: public short getColumn() {
120: return column;
121: }
122:
123: public void setRow(int row) {
124: this .row = row;
125: }
126:
127: public void setColumn(short column) {
128: this.column = column;
129: }
130: }
|