⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 supbookrecord.java

📁 jxtl API Java中Excel的生成与导入解析参考文档
💻 JAVA
字号:
/***********************************************************************      Copyright (C) 2002 Andrew Khan** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA***************************************************************************/package jxl.read.biff;import common.Logger;import jxl.WorkbookSettings;import jxl.biff.IntegerHelper;import jxl.biff.RecordData;import jxl.biff.StringHelper;/** * A record containing the references to the various sheets (internal and * external) referenced by formulas in this workbook */public class SupbookRecord extends RecordData{  /**   * The logger   */  private static Logger logger = Logger.getLogger(SupbookRecord.class);  /**   * The type of this supbook record   */  private Type type;  /**   * The number of sheets - internal & external supbooks only   */  private int numSheets;  /**   * The name of the external file   */  private String fileName;  /**   * The names of the external sheets   */  private String[] sheetNames;  /**   * The type of supbook this refers to   */  private static class Type {};  public static final Type INTERNAL = new Type();  public static final Type EXTERNAL = new Type();  public static final Type ADDIN    = new Type();  public static final Type LINK     = new Type();  public static final Type UNKNOWN  = new Type();  /**   * Constructs this object from the raw data   *   * @param t the raw data   * @param ws the workbook settings   */  SupbookRecord(Record t, WorkbookSettings ws)  {    super(t);    byte[] data = getRecord().getData();    // First deduce the type    if (data.length == 4)    {      if (data[2] == 0x01 && data[3] == 0x04)      {        type = INTERNAL;      }      else if (data[2] == 0x01 && data[3] == 0x3a)      {        type = ADDIN;      }      else      {        type = UNKNOWN;      }    }    else if (data[0] == 0 && data[1] == 0)    {      type = LINK;    }    else    {      type = EXTERNAL;    }    if (type == INTERNAL)    {      numSheets = IntegerHelper.getInt(data[0], data[1]);    }    if (type == EXTERNAL)    {      readExternal(data, ws);    }  }  /**   * Reads the external data records   *   * @param data the data   * @param ws the workbook settings   */  private void readExternal(byte[] data, WorkbookSettings ws)  {    numSheets = IntegerHelper.getInt(data[0], data[1]);    // subtract file name encoding from the length    int ln = IntegerHelper.getInt(data[2], data[3]) - 1;    int pos = 0;    if (data[4] == 0)    {      // non-unicode string      int encoding = data[5];      pos = 6;      if (encoding == 0)      {        fileName = StringHelper.getString(data, ln, pos, ws);        pos += ln;      }      else      {        fileName = getEncodedFilename(data, ln, pos);        pos += ln;      }    }    else    {      // unicode string      int encoding = IntegerHelper.getInt(data[5], data[6]);      pos = 7;      if (encoding == 0)      {        fileName = StringHelper.getUnicodeString(data, ln, pos);        pos += ln * 2;      }      else      {        fileName = getUnicodeEncodedFilename(data, ln, pos);        pos += ln * 2;      }    }    sheetNames = new String[numSheets];    for (int i = 0; i < sheetNames.length; i++)    {      ln = IntegerHelper.getInt(data[pos], data[pos + 1]);      if (data[pos + 2] == 0x0)      {        sheetNames[i] = StringHelper.getString(data, ln, pos + 3, ws);        pos += ln + 3;      }      else if (data[pos + 2] == 0x1)      {        sheetNames[i] = StringHelper.getUnicodeString(data, ln, pos + 3);        pos += ln * 2 + 3;      }    }  }  /**   * Gets the type of this supbook record   *   * @return the type of this supbook   */  public Type getType()  {    return type;  }  /**   * Gets the number of sheets.  This will only be non-zero for internal   * and external supbooks   *   * @return the number of sheets   */  public int getNumberOfSheets()  {    return numSheets;  }  /**   * Gets the name of the external file   *   * @return the name of the external file   */  public String getFileName()  {    return fileName;  }  /**   * Gets the name of the external sheet   *   * @param i the index of the external sheet   * @return the name of the sheet   */  public String getSheetName(int i)  {    return sheetNames[i];  }  /**   * Gets the data - used when copying a spreadsheet   *   * @return the raw external sheet data   */  public byte[] getData()  {    return getRecord().getData();  }  /**   * Gets the encoded string from the data array   *   * @param data the data   * @param ln length of the string   * @param pos the position in the array   * @return the string   */  private String getEncodedFilename(byte[] data, int ln, int pos)  {    StringBuffer buf = new StringBuffer();    int endpos = pos + ln;    while (pos <  endpos)    {      char c = (char) data[pos];      if (c == '\u0001')      {        // next character is a volume letter        pos++;        c = (char) data[pos];        buf.append(c);        buf.append(":\\\\");      }      else if (c == '\u0002')      {        // file is on the same volume        buf.append('\\');      }      else if (c == '\u0003')      {        // down directory        buf.append('\\');      }      else if (c == '\u0004')      {        // up directory        buf.append("..\\");      }      else      {        // just add on the character        buf.append(c);      }      pos++;    }    return buf.toString();  }  /**   * Gets the encoded string from the data array   *   * @param data the data   * @param ln length of the string   * @param pos the position in the array   * @return the string   */  private String getUnicodeEncodedFilename(byte[] data, int ln, int pos)  {    StringBuffer buf = new StringBuffer();    int endpos = pos + ln * 2;    while (pos <  endpos)    {      char c = (char) IntegerHelper.getInt(data[pos], data[pos + 1]);      if (c == '\u0001')      {        // next character is a volume letter        pos += 2;        c = (char) IntegerHelper.getInt(data[pos], data[pos + 1]);        buf.append(c);        buf.append(":\\\\");      }      else if (c == '\u0002')      {        // file is on the same volume        buf.append('\\');      }      else if (c == '\u0003')      {        // down directory        buf.append('\\');      }      else if (c == '\u0004')      {        // up directory        buf.append("..\\");      }      else      {        // just add on the character        buf.append(c);      }      pos += 2;    }    return buf.toString();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -