亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sheetdrawingwriter.java

?? java開發文檔之excel:jexcelapi_2_6_3.tar
?? JAVA
字號:
/*********************************************************************
*
*      Copyright (C) 2004 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.biff.drawing;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import common.Logger;

import jxl.WorkbookSettings;
import jxl.biff.IntegerHelper;
import jxl.write.biff.File;

/**
 * Handles the writing out of the different charts and images on a sheet.
 * Called by the SheetWriter object
 */
public class SheetDrawingWriter
{
  /**
   * The logger
   */
  private static Logger logger = Logger.getLogger(SheetDrawingWriter.class);

  /**
   * The drawings on the sheet
   */
  private ArrayList drawings;

  /**
   * Flag indicating whether the drawings on the sheet were modified
   */
  private boolean drawingsModified;

  /**
   * The charts on the sheet
   */
  private Chart[] charts;

  /**
   * The workbook settings
   */
  private WorkbookSettings workbookSettings;

  /**
   * Constructor
   *
   * @param ws the workbook settings
   */
  public SheetDrawingWriter(WorkbookSettings ws)
  {
    charts = new Chart[0];
  }

  /**
   * The drawings on the sheet
   *
   * @param dr the list of drawings
   * @param mod flag indicating whether the drawings have been tampered with
   */
  public void setDrawings(ArrayList dr, boolean mod)
  {
    drawings = dr;
    drawingsModified = mod;
  }

  /**
   * Writes out the MsoDrawing records and Obj records for each image
   * and chart on the sheet
   *
   * @param outputFile the output file
   * @exception IOException
   */
  public void write(File outputFile) throws IOException
  {
    // If there are no drawings or charts on this sheet then exit
    if (drawings.size() == 0 && charts.length == 0)
    {
      return;
    }

    // See if any drawing has been modified
    boolean modified = drawingsModified;
    int numImages = drawings.size();

    for (Iterator i = drawings.iterator(); i.hasNext() && !modified;)
    {
      DrawingGroupObject d = (DrawingGroupObject) i.next();
      if (d.getOrigin() != Origin.READ)
      {
        modified = true;
      }
    }

    // If the drawing order has been muddled at all, then we'll need
    // to regenerate the Escher drawing data
    if (numImages > 0 && !modified)
    {
      DrawingGroupObject d2 = (DrawingGroupObject) drawings.get(0);
      if (!d2.isFirst())
      {
        modified = true;
      }
    }

    // Check to see if this sheet consists of just a single chart.  If so
    // there is no MsoDrawingRecord, so write out the data and exit
    if (numImages == 0 &&
        charts.length == 1 &&
        charts[0].getMsoDrawingRecord() == null)
    {
      modified = false; // this sheet has not been modified
    }

    // If no drawing has been modified, then simply write them straight out
    // again and exit
    if (!modified)
    {
      writeUnmodified(outputFile);
      return;
    }

    Object[] spContainerData = new Object[numImages + charts.length];
    int length = 0;
    EscherContainer firstSpContainer = null;

    // Get all the spContainer byte data from the drawings
    // and store in an array
    for (int i = 0; i < numImages; i++)
    {
      DrawingGroupObject drawing = (DrawingGroupObject) drawings.get(i);

      EscherContainer spc = drawing.getSpContainer();

      if (spc != null)
      {
        byte[] data = spc.getData();
        spContainerData[i] = data;

        if (i == 0)
        {
          firstSpContainer = spc;
        }
        else
        {
          length += data.length;
        }
      }
    }

    // Get all the spContainer bytes from the charts and add to the array
    for (int i = 0; i < charts.length; i++)
    {
      EscherContainer spContainer = charts[i].getSpContainer();
      byte[] data = spContainer.getBytes(); //use getBytes instead of getData
      data = spContainer.setHeaderData(data);
      spContainerData[i + numImages] = data;

      if (i == 0 && numImages == 0)
      {
        firstSpContainer = spContainer;
      }
      else
      {
        length += data.length;
      }
    }

    // Put the generalised stuff around the first item
    DgContainer dgContainer = new DgContainer();
    Dg dg  = new Dg(numImages + charts.length);
    dgContainer.add(dg);

    SpgrContainer spgrContainer = new SpgrContainer();

    SpContainer spContainer = new SpContainer();
    Spgr spgr = new Spgr();
    spContainer.add(spgr);
    Sp sp = new Sp(ShapeType.MIN, 1024, 5);
    spContainer.add(sp);
    spgrContainer.add(spContainer);

    spgrContainer.add(firstSpContainer);

    dgContainer.add(spgrContainer);

    byte[] firstMsoData = dgContainer.getData();

    // Adjust the length of the DgContainer
    int len = IntegerHelper.getInt(firstMsoData[4],
                                   firstMsoData[5],
                                   firstMsoData[6],
                                   firstMsoData[7]);
    IntegerHelper.getFourBytes(len + length, firstMsoData, 4);

    // Adjust the length of the SpgrContainer
    len = IntegerHelper.getInt(firstMsoData[28],
                               firstMsoData[29],
                               firstMsoData[30],
                               firstMsoData[31]);
    IntegerHelper.getFourBytes(len + length, firstMsoData, 28);

    // Now write out each MsoDrawing record

    // First MsoRecord
    // test hack for form objects, to remove the ClientTextBox record
    // from the end of the SpContainer
    if (numImages > 0 &&
        ((DrawingGroupObject) drawings.get(0)).isFormObject())
    {
      byte[] msodata2 = new byte[firstMsoData.length - 8];
      System.arraycopy(firstMsoData, 0, msodata2, 0, msodata2.length);
      firstMsoData = msodata2;
    }

    MsoDrawingRecord msoDrawingRecord = new MsoDrawingRecord(firstMsoData);
    outputFile.write(msoDrawingRecord);

    if (numImages > 0)
    {
      DrawingGroupObject firstDrawing = (DrawingGroupObject) drawings.get(0);
      firstDrawing.writeAdditionalRecords(outputFile);
    }
    else
    {
      // first image is a chart
      Chart chart = charts[0];
      ObjRecord objRecord = chart.getObjRecord();
      outputFile.write(objRecord);
      outputFile.write(chart);
    }

    // Now do all the others
    for (int i = 1; i < spContainerData.length; i++)
    {
      byte[] bytes = (byte[]) spContainerData[i];

      // test hack for form objects, to remove the ClientTextBox record
      // from the end of the SpContainer
      if (i < numImages &&
          ((DrawingGroupObject) drawings.get(i)).isFormObject())
      {
        byte[] bytes2 = new byte[bytes.length - 8];
        System.arraycopy(bytes, 0, bytes2, 0, bytes2.length);
        bytes = bytes2;
      }

      msoDrawingRecord = new MsoDrawingRecord(bytes);
      outputFile.write(msoDrawingRecord);

      if (i < numImages)
      {
        // Write anything else the object needs
        DrawingGroupObject d = (DrawingGroupObject) drawings.get(i);
        d.writeAdditionalRecords(outputFile);
      }
      else
      {
        Chart chart = charts[i - numImages];
        ObjRecord objRecord = chart.getObjRecord();
        outputFile.write(objRecord);
        outputFile.write(chart);
      }
    }

    // Write any tail records that need to be written
    for (Iterator i = drawings.iterator(); i.hasNext();)
    {
      DrawingGroupObject dgo2 = (DrawingGroupObject) i.next();
      dgo2.writeTailRecords(outputFile);
    }
  }

  /**
   * Writes out the drawings and the charts if nothing has been modified
   *
   * @param outputFile the output file
   * @exception IOException
   */
  private void writeUnmodified(File outputFile) throws IOException
  {
    if (charts.length == 0 && drawings.size() == 0)
    {
      // No drawings or charts
      return;
    }
    else if (charts.length == 0 && drawings.size() != 0)
    {
      // If there are no charts, then write out the drawings and return
      for (Iterator i = drawings.iterator(); i.hasNext();)
      {
        DrawingGroupObject d = (DrawingGroupObject) i.next();
        outputFile.write(d.getMsoDrawingRecord());
        d.writeAdditionalRecords(outputFile);
      }

      for (Iterator i = drawings.iterator(); i.hasNext();)
      {
        DrawingGroupObject d = (DrawingGroupObject) i.next();
        d.writeTailRecords(outputFile);
      }
      return;
    }
    else if (drawings.size() == 0 && charts.length != 0)
    {
      // If there are no drawings, then write out the charts and return
      Chart curChart = null;
      for (int i = 0; i < charts.length; i++)
      {
        curChart = charts[i];
        if (curChart.getMsoDrawingRecord() != null)
        {
          outputFile.write(curChart.getMsoDrawingRecord());
        }

        if (curChart.getObjRecord() != null)
        {
          outputFile.write(curChart.getObjRecord());
        }

        outputFile.write(curChart);
      }

      return;
    }

    // There are both charts and drawings - the output
    // drawing group records will need
    // to be re-jigged in order to write the drawings out first, then the
    // charts
    int numDrawings = drawings.size();
    int length = 0;
    EscherContainer[] spContainers =
      new EscherContainer[numDrawings + charts.length];
    boolean[] isFormObject = new boolean[numDrawings + charts.length];

    for (int i = 0; i < numDrawings; i++)
    {
      DrawingGroupObject d = (DrawingGroupObject) drawings.get(i);
      spContainers[i] = d.getSpContainer();

      if (i > 0)
      {
        length += spContainers[i].getLength();
      }

      if (d.isFormObject())
      {
        isFormObject[i] = true;
      }
    }

    for (int i = 0; i < charts.length; i++)
    {
      spContainers[i + numDrawings] = charts[i].getSpContainer();
      length += spContainers[i + numDrawings].getLength();
    }

    // Put the generalised stuff around the first item
    DgContainer dgContainer = new DgContainer();
    Dg dg  = new Dg(numDrawings + charts.length);
    dgContainer.add(dg);

    SpgrContainer spgrContainer = new SpgrContainer();

    SpContainer spContainer = new SpContainer();
    Spgr spgr = new Spgr();
    spContainer.add(spgr);
    Sp sp = new Sp(ShapeType.MIN, 1024, 5);
    spContainer.add(sp);
    spgrContainer.add(spContainer);

    spgrContainer.add(spContainers[0]);

    dgContainer.add(spgrContainer);

    byte[] firstMsoData = dgContainer.getData();

    // Adjust the length of the DgContainer
    int len = IntegerHelper.getInt(firstMsoData[4],
                                   firstMsoData[5],
                                   firstMsoData[6],
                                   firstMsoData[7]);
    IntegerHelper.getFourBytes(len + length, firstMsoData, 4);

    // Adjust the length of the SpgrContainer
    len = IntegerHelper.getInt(firstMsoData[28],
                               firstMsoData[29],
                               firstMsoData[30],
                               firstMsoData[31]);
    IntegerHelper.getFourBytes(len + length, firstMsoData, 28);

    // Now write out each MsoDrawing record and object record

    // Hack to remove the last eight bytes (text box escher record)
    // from the container
    if (isFormObject[0] == true)
    {
      byte[] cbytes = new byte[firstMsoData.length - 8];
      System.arraycopy(firstMsoData, 0, cbytes, 0, cbytes.length);
      firstMsoData = cbytes;
    }

    // First MsoRecord
    MsoDrawingRecord msoDrawingRecord = new MsoDrawingRecord(firstMsoData);
    outputFile.write(msoDrawingRecord);

    DrawingGroupObject dgo = (DrawingGroupObject) drawings.get(0);
    dgo.writeAdditionalRecords(outputFile);

    // Now do all the others
    for (int i = 1; i < spContainers.length; i++)
    {
      byte[] bytes = spContainers[i].getBytes();
      byte[] bytes2 = spContainers[i].setHeaderData(bytes);

      // Hack to remove the last eight bytes (text box escher record)
      // from the container
      if (isFormObject[i] == true)
      {
        byte[] cbytes = new byte[bytes2.length - 8];
        System.arraycopy(bytes2, 0, cbytes, 0, cbytes.length);
        bytes2 = cbytes;
      }

      msoDrawingRecord = new MsoDrawingRecord(bytes2);
      outputFile.write(msoDrawingRecord);

      if (i < numDrawings)
      {
        dgo = (DrawingGroupObject) drawings.get(i);
        dgo.writeAdditionalRecords(outputFile);
      }
      else
      {
        Chart chart = charts[i - numDrawings];
        ObjRecord objRecord = chart.getObjRecord();
        outputFile.write(objRecord);
        outputFile.write(chart);
      }
    }

    // Write any tail records that need to be written
    for (Iterator i = drawings.iterator(); i.hasNext();)
    {
      DrawingGroupObject dgo2 = (DrawingGroupObject) i.next();
      dgo2.writeTailRecords(outputFile);
    }
  }

  /**
   * Sets the charts on the sheet
   *
   * @param ch the charts
   */
  public void setCharts(Chart[] ch)
  {
    charts = ch;
  }

  /**
   * Accessor for the charts on the sheet
   *
   * @return the charts
   */
  public Chart[] getCharts()
  {
    return charts;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99久久久欧美国产| 天天色天天操综合| 久久久国产精品午夜一区ai换脸| 欧美日韩精品系列| 欧美美女一区二区三区| 欧美理论电影在线| 欧美一区二区三区在线看| 日韩欧美的一区| 久久久高清一区二区三区| 国产人久久人人人人爽| 亚洲天堂a在线| 亚洲成av人综合在线观看| 卡一卡二国产精品 | 91精品黄色片免费大全| 成人app在线观看| 欧美日韩精品免费| 久久精品视频在线免费观看| 一区二区视频免费在线观看| 日本不卡视频在线| 国内精品不卡在线| 在线亚洲精品福利网址导航| 不卡一区二区中文字幕| 欧美美女bb生活片| 国产精品三级视频| 久久99最新地址| 欧美亚州韩日在线看免费版国语版| 日韩视频在线永久播放| 一区二区在线看| 粉嫩aⅴ一区二区三区四区 | 国产精品久久国产精麻豆99网站| 亚洲免费电影在线| 国产成人av电影在线播放| 91麻豆精品国产91久久久更新时间| 国产精品视频免费| 久久成人久久爱| 91精品国模一区二区三区| 亚洲制服丝袜一区| 在线视频你懂得一区二区三区| 国产精品欧美一级免费| 久久成人羞羞网站| 久久综合狠狠综合久久激情| 免费欧美日韩国产三级电影| 欧美性videosxxxxx| 亚洲午夜在线观看视频在线| 欧美亚洲一区二区在线| 亚洲地区一二三色| 欧美一区二区三区电影| 日韩福利电影在线| 精品处破学生在线二十三| 青青国产91久久久久久| 日韩女优电影在线观看| 国产suv一区二区三区88区| 国产精品久久久久久久裸模| 色综合色狠狠综合色| 一个色综合av| 欧美成人三级在线| 成人污污视频在线观看| 亚洲一区二区精品久久av| 欧美电影免费观看高清完整版在线| 日韩精品每日更新| 国产精品久久久久久久久免费桃花| 91亚洲国产成人精品一区二区三 | 成人av网站在线观看免费| 亚洲人午夜精品天堂一二香蕉| 91免费观看视频在线| 日本女优在线视频一区二区| 国产欧美日韩卡一| 欧美夫妻性生活| 色网站国产精品| 日韩—二三区免费观看av| 中文字幕精品一区二区精品绿巨人| 在线观看一区二区精品视频| 国产在线视视频有精品| 亚洲国产色一区| 亚洲自拍与偷拍| 亚洲蜜臀av乱码久久精品蜜桃| 国产日韩欧美一区二区三区乱码| 欧美日韩激情一区二区| 日本韩国一区二区| 国产91丝袜在线观看| 精品影视av免费| 奇米一区二区三区| 午夜影院久久久| 亚洲国产精品久久人人爱蜜臀 | 精品在线播放午夜| 日日骚欧美日韩| 秋霞av亚洲一区二区三| 亚洲国产日韩在线一区模特| 亚洲黄色小说网站| 亚洲欧美另类久久久精品2019| 综合久久一区二区三区| 国产精品日日摸夜夜摸av| 国产精品你懂的| 中文字幕亚洲精品在线观看| 亚洲天堂免费看| 亚洲国产成人av好男人在线观看| 夜夜精品视频一区二区| 午夜影院在线观看欧美| 日本在线不卡视频| 国产毛片精品国产一区二区三区| 国产一区美女在线| 99久久综合精品| 欧美三级欧美一级| 国产清纯美女被跳蛋高潮一区二区久久w| 久久久久综合网| 亚洲人快播电影网| 麻豆国产欧美日韩综合精品二区| 韩国女主播一区| 在线国产电影不卡| 久久蜜桃一区二区| 日韩毛片高清在线播放| 国产a级毛片一区| 夜夜精品浪潮av一区二区三区| 欧美大白屁股肥臀xxxxxx| 亚洲国产高清在线| 天天综合色天天综合色h| 成人av网在线| 久久网站热最新地址| 天堂一区二区在线| 99久久婷婷国产综合精品电影| 日韩一区二区三区电影在线观看| 中文字幕一区二区视频| 国产久卡久卡久卡久卡视频精品| 欧美在线综合视频| 亚洲六月丁香色婷婷综合久久 | 成人免费看片app下载| 日韩精品自拍偷拍| 日本va欧美va瓶| 欧美精品一级二级三级| 亚洲人妖av一区二区| 成人免费观看av| 国产精品乱子久久久久| jlzzjlzz亚洲女人18| 国产精品短视频| 91久久精品午夜一区二区| 久久97超碰国产精品超碰| 国产视频一区二区在线观看| 国产精品一区二区视频| 国产精品你懂的| 色视频成人在线观看免| 日韩av不卡在线观看| 欧美一区二区三区不卡| 国精产品一区一区三区mba视频 | 国内精品在线播放| 国产女人18水真多18精品一级做| av午夜精品一区二区三区| 亚洲一区精品在线| 精品国产精品网麻豆系列| 成人国产一区二区三区精品| 亚洲一区二区三区精品在线| 精品国一区二区三区| 色哟哟一区二区在线观看| 日韩高清一区二区| 国产精品美女久久久久久久网站| 欧美视频一区在线观看| 激情图片小说一区| 一级中文字幕一区二区| 精品成人佐山爱一区二区| eeuss鲁片一区二区三区在线观看| 亚洲美女淫视频| 国产精品无遮挡| 欧美zozozo| 欧美日高清视频| 北条麻妃一区二区三区| 国产一区二区三区久久久| 亚洲电影一级片| 亚洲欧洲成人av每日更新| 久久婷婷成人综合色| 精品久久久久av影院| 欧美日韩不卡一区| 欧美日韩国产首页| 在线观看区一区二| av在线播放成人| 成人18视频在线播放| 国产麻豆精品在线| 国产91色综合久久免费分享| 国产一区二区三区免费播放| 久久9热精品视频| 国产成人av电影在线| 国产美女视频一区| 波多野结衣一区二区三区| 北条麻妃一区二区三区| 在线免费av一区| 欧美日韩成人在线| 精品少妇一区二区三区| 2020日本不卡一区二区视频| 亚洲国产精品v| 一区二区三区中文字幕在线观看| 亚洲va韩国va欧美va| 另类中文字幕网| 97aⅴ精品视频一二三区| 欧美伊人精品成人久久综合97| 日韩一区二区在线看片| 国产亚洲欧美日韩在线一区| 专区另类欧美日韩| 久久国产麻豆精品| 91久久精品一区二区二区| 亚洲精品一区在线观看| 洋洋成人永久网站入口| 经典一区二区三区|