jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://www.javaresearch.org/article/45784.htm


          /**
          * <p>讀取Excel表格,拷貝、更新Excel工作薄 </p>
          * <p>Description: 可以讀取Excel文件的內容,更新Excel工作薄
          * </p>
          * <p>Copyright: Copyright (c) Corparation 2005</p>
          * <p>程序開發環境為eclipse</p>
          * @author Walker
          * @version 1.0
          */
          package cn.com.yitong.xls;

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.InputStream;
          import java.util.Vector;

          import cn.com.yitong.ChartImg;
          import cn.com.yitong.VireObj;
          import cn.com.yitong.platform.log.YTLogger;

          import jxl.CellType;
          import jxl.Workbook;
          import jxl.format.CellFormat;
          import jxl.format.Colour;
          import jxl.format.UnderlineStyle;
          import jxl.write.Formula;
          import jxl.write.Label;
          import jxl.write.Number;
          import jxl.write.WritableCell;
          import jxl.write.WritableCellFormat;
          import jxl.write.WritableFont;
          import jxl.write.WritableImage;
          import jxl.write.WritableSheet;
          import jxl.write.WritableWorkbook;
          import jxl.write.WriteException;
          import jxl.write.biff.RowsExceededException;

          public class XLSDemo
          {
              private static final int TITLE_LENGTH = 7;
              private static final int SHEET_WIDTH = 32;
              private static final int SHEET_HEIGHT = 116;
              
              /**
               * 創建Excel
               */
              private void makeXls()
              {
                  Workbook workbook = null;
                  try
                  {
                      // 構建Workbook對象, 只讀Workbook對象
                      // 直接從本地文件創建Workbook, 從輸入流創建Workbook
                      InputStream ins = new FileInputStream("D:/Workspace/testproj/source.xls");
                      workbook = Workbook.getWorkbook(ins);

                      // 利用已經創建的Excel工作薄創建新的可寫入的Excel工作薄
                      File outFile = new File("D:/Workspace/testproj/test.xls");
                      WritableWorkbook wwb = Workbook.createWorkbook(outFile, workbook);
                      // 讀取第一張工作表
                      WritableSheet dataSheet = wwb.getSheet(0);
                      //  設置凍結單元格
                      dataSheet.getSettings().setVerticalFreeze(7);
                      dataSheet.getSettings().setHorizontalFreeze(2);
                      
                      // 測試模擬數據
                      Vector vecData = new Vector();
                      for(int i = 0; i < 50; i ++)
                      {
                          VireObj obj = new VireObj();
                          obj.setOrgNo("00" + i + "0");
                          obj.setOrgName("機構" + (i + 1));
                          obj.setOpenAcc((int)(100 * Math.random()));
                          obj.setDestoryAcc((int)(10 * Math.random()));
                          obj.setTotalAcc((int)(500 * Math.random()));
                          obj.setMonthInCount((int)(500 * Math.random()));
                          obj.setMonthInMoney(500 * Math.random());
                          obj.setMonthOutCount((int)(500 * Math.random()));
                          obj.setMonthOutMoney(500 * Math.random());
                          
                          vecData.add(obj);
                      }            
                      // 插入數據
                      insertData(wwb, dataSheet, vecData);            
                      // 插入模擬圖像數據
                      Vector vecImg = new Vector();
                      for(int i = 0; i < 3; i ++)
                      {
                          ChartImg img = new ChartImg();
                          img.setImgTitle("圖像" + (i + 1));
                          img.setImgName("D:/Workspace/testproj/images/barchart.png");
                          vecImg.add(img);
                      }
                      // 插入圖表
                      insertImgsheet(wwb, vecImg);
                      //寫入Excel對象
                      wwb.write();
                      wwb.close();
                  } catch (Exception e)
                  {
                      YTLogger.logDebug(e);
                  } finally
                  {
                      // 操作完成時,關閉對象,釋放占用的內存空間
                      workbook.close();
                  }
              }
              
              /**
               * 插入數據
               * @param wwb WritableWorkbook : 工作簿
               * @param dataSheet WritableSheet : 工作表
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void insertData(WritableWorkbook wwb, WritableSheet dataSheet, Vector vecData) throws RowsExceededException, WriteException
              {
                  // 獲得標題單元格對象        
                  modiStrCell(dataSheet, 2, 0, "工商銀行江蘇省分行 個人網上銀行業務種類/開銷戶明細報表(2005-12)", null);
                  // 修改數據單元格數據
                  for(int i = 0; i < vecData.size(); i ++)
                  {
                      VireObj obj = (VireObj)vecData.get(i);
                      modiStrCell(dataSheet, 0, TITLE_LENGTH + i, obj.getOrgNo(), null);
                      modiStrCell(dataSheet, 1, TITLE_LENGTH + i, obj.getOrgName(), null);
                      modiNumCell(dataSheet, 2, TITLE_LENGTH + i, obj.getOpenAcc(), null);
                      modiNumCell(dataSheet, 3, TITLE_LENGTH + i, obj.getDestoryAcc(), null);
                      modiNumCell(dataSheet, 4, TITLE_LENGTH + i, obj.getTotalAcc(), null);
                      modiNumCell(dataSheet, 5, TITLE_LENGTH + i, obj.getMonthInCount(), null);
                      modiNumCell(dataSheet, 6, TITLE_LENGTH + i, obj.getTotalInMoney(), null);
                      modiNumCell(dataSheet, 7, TITLE_LENGTH + i, obj.getMonthOutCount(), null);
                      modiNumCell(dataSheet, 8, TITLE_LENGTH + i, obj.getMonthOutMoney(), null);
                  }    
                  // 刪除空行
                  for (int j = vecData.size() + TITLE_LENGTH; j < SHEET_HEIGHT; j++)
                  {
                      dataSheet.removeRow(vecData.size() + TITLE_LENGTH);
                  }        
                  // 插入公式
                  for(int i = 2; i < SHEET_WIDTH; i ++)
                  {
                      modiFormulaCell(dataSheet, i, vecData.size() + TITLE_LENGTH, 8, vecData.size() + TITLE_LENGTH, null);
                  }        
              }

              /**
               * 修改字符單元格的值
               * @param dataSheet WritableSheet : 工作表
               * @param col int : 列
               * @param row int : 行
               * @param str String : 字符
               * @param format CellFormat : 單元格的樣式
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void modiStrCell(WritableSheet dataSheet, int col, int row, String str, CellFormat format) throws RowsExceededException, WriteException
              {
                  // 獲得單元格對象
                  WritableCell cell = dataSheet.getWritableCell(col, row);
                  // 判斷單元格的類型, 做出相應的轉化
                  if (cell.getType() == CellType.EMPTY)
                  {
                      Label lbl = new Label(col, row, str);
                      if(null != format)
                      {
                          lbl.setCellFormat(format);
                      } else
                      {
                          lbl.setCellFormat(cell.getCellFormat());
                      }
                      dataSheet.addCell(lbl);
                  } else if (cell.getType() == CellType.LABEL)
                  {
                      Label lbl = (Label)cell;
                      lbl.setString(str);
                  } else if (cell.getType() == CellType.NUMBER)
                  {
                      // 數字單元格修改
                      Number n1 = (Number)cell;
                      n1.setValue(42.05);
                  }
              }
              
              /**
               * 修改數字單元格的值
               * @param dataSheet WritableSheet : 工作表
               * @param col int : 列
               * @param row int : 行
               * @param num double : 數值
               * @param format CellFormat : 單元格的樣式
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void modiNumCell(WritableSheet dataSheet, int col, int row, double num, CellFormat format) throws RowsExceededException, WriteException
              {
                  // 獲得單元格對象
                  WritableCell cell = dataSheet.getWritableCell(col, row);
                  // 判斷單元格的類型, 做出相應的轉化
                  if (cell.getType() == CellType.EMPTY)
                  {
                      Number lbl = new Number(col, row, num);
                      if(null != format)
                      {
                          lbl.setCellFormat(format);
                      } else
                      {
                          lbl.setCellFormat(cell.getCellFormat());
                      }
                      dataSheet.addCell(lbl);
                  } else if (cell.getType() == CellType.NUMBER)
                  {
                      // 數字單元格修改
                      Number lbl = (Number)cell;
                      lbl.setValue(num);
                  } else if (cell.getType() == CellType.LABEL)
                  {
                      Label lbl = (Label)cell;
                      lbl.setString(String.valueOf(num));
                  }
              }
              
              /**
               * 修改公式單元格的值
               * @param dataSheet WritableSheet : 工作表
               * @param col int : 列
               * @param row int : 行
               * @param startPos int : 開始位置
               * @param endPos int : 結束位置
               * @param format
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void modiFormulaCell(WritableSheet dataSheet, int col, int row, int startPos, int endPos, CellFormat format) throws RowsExceededException, WriteException
              {
                  String f = getFormula(col, row, startPos, endPos);
                  // 插入公式(只支持插入,不支持修改)
                  WritableCell cell = dataSheet.getWritableCell(col, row);
                  if (cell.getType() == CellType.EMPTY)
                  {                    
                      // 公式單元格
                      Formula lbl = new Formula(col, row, f);
                      if(null != format)
                      {
                          lbl.setCellFormat(format);
                      } else
                      {
                          lbl.setCellFormat(cell.getCellFormat());
                      }
                      dataSheet.addCell(lbl);
                  } else if (cell.getType() == CellType.STRING_FORMULA)
                  {
                      YTLogger.logWarn("Formula modify not supported!");
                  }
              }
              
              /**
               * 得到公式
               * @param col int : 列
               * @param row int : 行
               * @param startPos int : 開始位置
               * @param endPos int : 結束位置
               * @return String
               * @throws RowsExceededException
               * @throws WriteException
               */
              private String getFormula(int col, int row, int startPos, int endPos)
                      throws RowsExceededException, WriteException
              {
                  char base = 'A';
                  char c1 = base;
                  StringBuffer formula = new StringBuffer(128);
                  // 組裝公式
                  formula.append("SUM(");
                  if (col <= 25)
                  {
                      c1 = (char) (col % 26 + base);
                      formula.append(c1).append(startPos).append(":")
                             .append(c1).append(endPos).append(")");
                  } else if (col > 25)
                  {
                      char c2 = (char) ((col - 26) / 26 + base);
                      c1 = (char) ((col - 26) % 26 + base);
                      formula.append(c2).append(c1).append(startPos).append(":")
                             .append(c2).append(c1).append(endPos).append(")");
                  }

                  return formula.toString();
              }
              
              /**
               * 插入圖表工作表
               * @param wwb WritableWorkbook : 工作簿
               * @param vecImg Vector : 圖像鏈表
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void insertImgsheet(WritableWorkbook wwb, Vector vecImg)
                      throws RowsExceededException, WriteException
              {
                  // 插入圖像
                  WritableSheet imgSheet;
                  if((wwb.getSheets()).length < 2)
                  {
                      imgSheet = wwb.createSheet("圖表", 1);
                  } else
                  {
                      imgSheet = wwb.getSheet(1);
                  }
                  
                  for (int i = 0; i < vecImg.size(); i++)
                  {
                      ChartImg chart = (ChartImg) vecImg.get(i);
                      // 插入圖像標題
                      Label lbl = new Label(0, 2 + 20 * i, chart.getImgTitle());
                      WritableFont font = new WritableFont(WritableFont.ARIAL,
                              WritableFont.DEFAULT_POINT_SIZE, WritableFont.NO_BOLD, false,
                              UnderlineStyle.NO_UNDERLINE, Colour.DARK_BLUE2);
                      WritableCellFormat background = new WritableCellFormat(font);
                      background.setWrap(true);
                      background.setBackground(Colour.GRAY_25);
                      imgSheet.mergeCells(0, 2 + 20 * i, 9, 2 + 20 * i);
                      lbl.setCellFormat(background);
                      imgSheet.addCell(lbl);
                      // 插入圖像單元格
                      insertImgCell(imgSheet, 2, 4 + 20 * i, 8, 15, chart.getImgName());
                  }
              }

              /**
               * 插入圖像到單元格(圖像格式只支持png)
               * @param dataSheet WritableSheet : 工作表
               * @param col int : 列
               * @param row int : 行
               * @param width int : 寬
               * @param height int : 高
               * @param imgName String : 圖像的全路徑
               * @throws RowsExceededException
               * @throws WriteException
               */
              private void insertImgCell(WritableSheet dataSheet, int col, int row, int width,
                      int height, String imgName) throws RowsExceededException, WriteException
              {
                  File imgFile = new File(imgName);
                  WritableImage img = new WritableImage(col, row, width, height, imgFile);
                  dataSheet.addImage(img);
              }
              
              /**
               * 測試
               * @param args
               */
              public static void main(String[] args)
              {
                  XLSDemo demo = new XLSDemo();
                  demo.makeXls();
              }
          }



          posted on 2008-03-10 18:15 jinfeng_wang 閱讀(1152) 評論(0)  編輯  收藏 所屬分類: java 、ZZ
          主站蜘蛛池模板: 老河口市| 陵川县| 山东| 武乡县| 体育| 太仓市| 卫辉市| 盐边县| 洛宁县| 林州市| 乌兰浩特市| 兴安县| 浮梁县| 娄烦县| 连平县| 泉州市| 德钦县| 郎溪县| 中阳县| 绵阳市| 石嘴山市| 贞丰县| 秦皇岛市| 揭阳市| 昌都县| 新乐市| 竹山县| 云阳县| 洛浦县| 邮箱| 喀喇| 嘉义市| 紫云| 禄劝| 靖边县| 台江县| 北海市| 政和县| 晋江市| 迭部县| 乌什县|