搜尋此網誌

windows常用命令

[ 群組原則 ]
開始 → 執行 → gpedit.msc

[ 惡意軟體移除工具 ]
開始 → 執行 → mrt

[ 機碼 ]
開始 → 執行 → regedit

[ 系統設定公用程式 ]
開始 → 執行 → msconfig

[ 控制client端所有網路設備 ]
開始 → 執行 → cmd → ipconfig
開始 → 執行 → cmd → ipconfig/all

[ 顯示封包經過的路由器的IP位址 ]
開始 → 執行 → cmd → tracert (網址或IP)

2011年11月29日 星期二

Eclipse Preferences

Formatter
wrap where necessary
包裹在必要時

wrap first element, others where necessary
包裝的第一個元素,其他人在必要時

wrap all elements, indent all but the first element
包裝的所有元素,縮進所有,但第一個元素

wrap all elements, except first element if not necessary
包裝的所有元素,除了第一個元素如果沒有必要

2011年11月8日 星期二

Eclipse 啟動參數

eclipse.exe -nl en_US -clean -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxNewSize=32M -XX:NewSize=32M -Xmx256m -Xms128m

-nl 後面跟的是語言,-nl en_US,介面變成英文。

-clean 是當啟動Eclipse IDE時清空緩衝,一般來說在沒有更新插件的情況下,去掉這個參數啟動速度更快。

-vmargs 使用JRE的參數,後面就是JRE的參數了。

-Xverify:none 去掉JAR包數據驗證,一般來說只有在網絡環境下才需要驗證JAR包數據的有效性。本地的話可以不用驗證。

-XX:+UseParallelGC 使用並行垃圾收集機制,據說這個GC算法比較快。具體不清楚。

-XX:PermSize=20M -XX:MaxNewSize=32M -XX:NewSize=32M 這三個就是設置詳細的緩衝數據了。詳情看Java官方網站的介紹吧。

-Xmx256m Java虛擬機最大使用內存容量,根據你所使用機器的內容大小設置,只要不超過最大內存容量就好。

-Xms128m Java虛擬機初始化內存容量。



2011年10月25日 星期二

倉頡

廍    戈卜口中
磘    一口月人山
萡    廿水竹日
硦    一口一土廿

2011年10月21日 星期五

如何用Apache POI读取Excel


來源

看了网上很多的文章,都是一个样子的,自己研究了下POI,把经验和大家分享下。
首先POI是开源组织Apache出品的一个开源jar包,提供了方便解析Excel的API,我们可以非常方便的使用它来读取Excel。这里介绍3.5Final版本。
所需用到的jar包如下:
如何用Apache <wbr>POI读取Excel
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的类来解析,而Excel2007就是使用org.apache.poi.xssf.usermodel来解析。
解析Excel2003源码
StringBuffer content = new StringBuffer();
  HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用
  for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
   if (null != workbook.getSheetAt(numSheets)) {
    HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 获得一个sheet
    for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
     if (null != aSheet.getRow(rowNumOfSheet)) {
      HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一行
      for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {
       if (null != aRow.getCell(cellNumOfRow)) {
        HSSFCell aCell = aRow.getCell(cellNumOfRow); // 获得列值
        
        if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
         content.append(aCell.getNumericCellValue() + "\t");
        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
         content.append(aCell.getBooleanCellValue() + "\t");
        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
         content.append(aCell.getStringCellValue() + "\t");
        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){
         content.append(aCell.getCellFormula() + "\t");
        } else {
         continue;
        }
       }
       if(cellNumOfRow == aRow.getLastCellNum()) {
        content.append("\n");
       }
      }
     }
    }
   }
  }
  return content.toString().trim();

解析Excel2007和2003基本一样,只是将HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。
另外要提醒大家的是Excel的样式都是基于一个单元格的,所以用HSSFRow.getRowStyle()拿样式会出问题的,不一定会拿到你想要的样式。处理合并单元格是POI的一个难点,只能通过判断当前单元格是否在合并单元格之中,如果是,那此单元格的值便是这个合并单元格的首位置单元格的值,只有通过这样才能来处理合并单元格。
处理合并单元格的代码:

 public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {
  //得到一个sheet中有多少个合并单元格
  int sheetmergerCount = sheet.getNumMergedRegions();
  for(int i = 0; i < sheetmergerCount; i++) {
   //得出具体的合并单元格
   CellRangeAddress ca = sheet.getMergedRegion(i);
   //得到合并单元格的起始行, 结束行, 起始列, 结束列
   int firstC = ca.getFirstColumn();
   int lastC = ca.getLastColumn();
   int firstR = ca.getFirstRow();
   int lastR = ca.getLastRow();
   //判断该单元格是否在合并单元格范围之内, 如果是, 则返回 true
   if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
    if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
     return true;
    }
   }
  }
  return false;
 }


 public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {
  //获得一个 sheet 中合并单元格的数量
  int sheetmergerCount = sheet.getNumMergedRegions();
  //便利合并单元格
  for(int i = 0; i < sheetmergerCount; i++) {
   //获得合并单元格
   CellRangeAddress ca = sheet.getMergedRegion(i);
   //获得合并单元格的起始行, 结束行, 起始列, 结束列
   int firstC = ca.getFirstColumn();
   int lastC = ca.getLastColumn();
   int firstR = ca.getFirstRow();
   int lastR = ca.getLastRow();
   //判断该单元格是否是在合并单元格中, 如果是, 则返回所在合并单元格的首单元格的值
   if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
    if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
     HSSFRow fRow = sheet.getRow(firstR);
     HSSFCell fCell = fRow.getCell(firstC);
     //除了合并单元格首单元格的值, 其余的用(*)来区分
     if (fCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC && hasBorder(cell)) {
      return String.valueOf(fCell.getNumericCellValue());
     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN && hasBorder(cell)) {
      return String.valueOf(fCell.getBooleanCellValue());
     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_STRING && hasBorder(cell)) {
      return fCell.getStringCellValue();
     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA && hasBorder(cell)){
      return String.valueOf(fCell.getCellFormula());
     }
    }
   }
  }
  return "";
 }

2011年9月30日 星期五

HSSFCellStyle


HSSFCellStyle有两个背景颜色属性,一个叫FillBackgroundColor,另一个叫FillForegroundColor,但其实这指的都是背景颜色,那为什么还有ForegroundColor呢?为了能够帮助大家理解,我们举一个实际的例子,下面这个图案是Excel的一个单元格:
线是白色的,背景是红色的。这里的线其实就是下面的Excel界面中的图案


至于线的颜色则是图案颜色,即白色。
 下面罗列一下图案样式及其对应的值:
图案样式 常量

HSSFCellStyle.NO_FILL
HSSFCellStyle.ALT_BARS
HSSFCellStyle.FINE_DOTS
HSSFCellStyle.SPARSE_DOTS
HSSFCellStyle.LESS_DOTS
HSSFCellStyle.LEAST_DOTS
HSSFCellStyle.BRICKS
HSSFCellStyle.BIG_SPOTS
HSSFCellStyle.THICK_FORWARD_DIAG
HSSFCellStyle.THICK_BACKWARD_DIAG
HSSFCellStyle.THICK_VERT_BANDS
HSSFCellStyle.THICK_HORZ_BANDS
HSSFCellStyle.THIN_HORZ_BANDS
HSSFCellStyle.THIN_VERT_BANDS
HSSFCellStyle.THIN_BACKWARD_DIAG
HSSFCellStyle.THIN_FORWARD_DIAG
HSSFCellStyle.SQUARES
HSSFCellStyle.DIAMONDS

2011年9月27日 星期二

備註各種Jar版本

一、POI 3.6
使用.xlsx會出現
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

2011年9月23日 星期五

正規運算式 Regular Expression

JWorld@TW Java論壇 - Java Regular Expression的學習筆記

Pattern (Java 2 Platform SE 6)

正規運算式 Regular Expression

13-4 正規運算式(Regular Expression)

//範例

以下的程式簡單地示範了幾個常用的method:

package demo.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {

    public static void main(String[] args) {

        // 測試 testString 中是否包含了 aa
        String testString = "ABCaaabcaac";
        System.out.println("String.contains():\t"+testString.contains("aa"));

        // 和上面目的相同,但運用了 regular expression
        // 而這其實是利用了 Pattern 的靜態方法matches()
        System.out.println("String.matches():\t"+testString.matches(".*aa.*"));
        System.out.println("Pattern.matches():\t"+Pattern.matches(".*aa.*",testString));
        System.out.println();

        // 如果要用相同的 regular expression 測試很多資料
        // 可以使用Pattern的靜態方法compile()來編譯
        // 之後就可以重覆使用這個pattern的matcher()方法來進行字串比對
        String testString2 = "aababcAc";
        Pattern pattern = Pattern.compile(".*aa.*");
        Matcher matcher = pattern.matcher(testString);
        System.out.println("matcher.matches():\t"+matcher.matches());
        matcher = pattern.matcher(testString2);
        System.out.println("matcher.matches():\t"+matcher.matches());
        System.out.println();

        // 另外Matcher中還有很多方法可以使用
        // 除了用 matcher.matches()可以比對字串是不是符合regular expression
        // 也可以利用 matcher.lookingAt()比對字串是不是某個regular expression開頭
        pattern = Pattern.compile("aa");
        matcher = pattern.matcher(testString);
        System.out.println("matcher.matches():\t"+matcher.lookingAt());
        matcher = pattern.matcher(testString2);
        System.out.println("matcher.matches():\t"+matcher.lookingAt());
        System.out.println();

        // 想取出字串中符合的區段則可以運用 matcher
        // 例如想從下面四個號碼找出手機的格式
        // 就可以用 matcher.find()及matcher.group()來取出符合的項目
        String testString3 = "0911-111111,             02-22222222      ,             0922-222222      , 03-33333333";
        pattern = Pattern.compile("\\d{4}-\\d{6}");
        matcher = pattern.matcher(testString3);
        while (matcher.find()) {
            System.out.println("matcher.group():\t"+matcher.group());
        }
    }
}

而輸出的結果如下:
String.contains(): true
String.matches(): true
Pattern.matches(): true

matcher.matches(): true
matcher.matches(): true

matcher.matches(): false
matcher.matches(): true

matcher.group():             0911-111111    
matcher.group():             0922-222222    

JavaScript傳中文值

//前一個JSP,optName是下拉選單的名稱

form1.action = "importExcelk.jsp?optName="+form1.fileType.options[form1.fileType.selectedIndex].text;
form1.submit();


//取值的JSP
new String(request.getParameter("aaa").getBytes("ISO-8859-1"), "UTF-8");