熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java對word、excel、pdf等操作綜合文章

2022-06-13   來源: Java核心技術 

  Java操作PDF
Java操作WordExcelAccess
參考:




?forum=&thread=&tstart=&trange=
Java Excel API 文檔


一個jacob操作Word的例子其他操作excelpdf的sample裡都有
  import javaioFile;
  import *;
  import comjacobactiveX*;
  public class WordTest {
  
   public static void main(String[] args) {
     WordBean word=new WordBean();
     wordopenWord(true);
     wordcreateNewDocument();
     wordinsertText(Hello word);
   }
  }
  
  
  import comjacobactiveX*;
  import *;
  public class WordBean extends javaawtPanel
  {
   private ActiveXComponent MsWordApp = null;
   private Dispatch document = null;
   public WordBean()
   {
     super();
   }
   public void openWord(boolean makeVisible)
   {
  //Open Word if weve not done it already
     if (MsWordApp == null)
     {
       MsWordApp = new ActiveXComponent(WordApplication);
     }
  //Set the visible property as required
     Dispatchput(MsWordApp Visible
            new Variant(makeVisible));
   }
   public void createNewDocument()
   {
  //Find the Documents collection object maintained by Word
     Dispatch documents =
         Dispatchget(MsWordAppDocuments)toDispatch();
  //Call the Add method of the Documents collection to create
  //a new document to edit
     document = Dispatchcall(documentsAdd)toDispatch();
   }
   public void insertText(String textToInsert)
   {
  // Get the current selection within Word at the moment If
  // a new document has just been created then this will be at
  // the top of the new doc
     Dispatch selection =
         Dispatchget(MsWordAppSelection)toDispatch();
  //Put the specified text at the insertion point
     Dispatchput(selectionTexttextToInsert);
   }
   public void saveFileAs(String filename)
   {
     Dispatchcall(documentSaveAsfilename);
   }
   public void printFile()
   {
  //Just print the current document to the default printer
     Dispatchcall(documentPrintOut);
   }
   public void closeDocument()
   {
  // Close the document without saving changes
  // = wdDoNotSaveChanges
  // = wdSaveChanges
  // = wdPromptToSaveChanges
     Dispatchcall(document Close new Variant());
     document = null;
   }
   public void closeWord()
   {
     Dispatchcall(MsWordAppQuit);
     MsWordApp = null;
     document = null;
   }
  }

Java Excel 操作excel
 從Excel文件讀取數據表

Java Excel API既可以從本地文件系統的一個文件(xls)也可以從輸入流中讀取Excel數據表讀取Excel數據表的第一步是創建Workbook(術 語工作薄)下面的代碼片段舉例說明了應該如何操作(完整代碼見ExcelReadingjava)


import javaio*;
import jxl*;
… … … …
try
{
//構建Workbook對象 只讀Workbook對象
//直接從本地文件創建Workbook
//從輸入流創建Workbook
    InputStream is = new FileInputStream(sourcefile);
    jxlWorkbook rwb = WorkbookgetWorkbook(is);
}
catch (Exception e)
{
eprintStackTrace();
}

  一旦創建了Workbook我們就可以通過它來訪問Excel Sheet(術語工作表)參考下面的代碼片段


//獲取第一張Sheet表
Sheet rs = rwbgetSheet();

我們既可能通過Sheet的名稱來訪問它也可以通過下標來訪問它如果通過下標來訪問的話要注意的一點是下標從開始就像數組一樣

一旦得到了Sheet我們就可以通過它來訪問Excel Cell(術語單元格)參考下面的代碼片段


//獲取第一行第一列的值
Cell c = rsgetCell( );
String strc = cgetContents();

//獲取第一行第二列的值
Cell c = rsgetCell( );
String strc = cgetContents();

//獲取第二行第二列的值
Cell c = rsgetCell( );
String strc = cgetContents();

Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());
Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());
Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());

如果僅僅是取得Cell的值我們可以方便地通過getContents()方法它可以將任何類型的Cell值都作為一個字符串返回示例代碼中 Cell( )是文本型Cell( )是數字型Cell()是日期型通過getContents()三種類型的返回值都是字符型

如果有需要知道Cell內容的確切類型API也提供了一系列的方法參考下面的代碼片段


String strc = null;
double strc = ;
Date strc = null;

Cell c = rsgetCell( );
Cell c = rsgetCell( );
Cell c = rsgetCell( );

if(cgetType() == CellTypeLABEL)
{
LabelCell labelc = (LabelCell)c;
strc = labelcgetString();
}
if(cgetType() == CellTypeNUMBER)
{
NmberCell numc = (NumberCell)c;
strc = numcgetValue();
}
if(cgetType() == CellTypeDATE)
{
DateCell datec = (DateCell)c;
strc = datecgetDate();
}

Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());
Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());
Systemoutprintln(Cell( ) + value : + strc + ; type : + cgetType());

在得到Cell對象後通過getType()方法可以獲得該單元格的類型然後與API提供的基本類型相匹配強制轉換成相應的類型最後調用相應的取 值方法getXXX()就可以得到確定類型的值API提供了以下基本類型與Excel的數據格式相對應如下圖所示


每種類型的具體意義請參見Java Excel API Document

當你完成對Excel電子表格數據的處理後一定要使用close()方法來關閉先前創建的對象以釋放讀取數據表的過程中所占用的內存空間在讀取大量數據時顯得尤為重要參考如下代碼片段


//操作完成時關閉對象釋放占用的內存空間
rwbclose();

Java Excel API提供了許多訪問Excel數據表的方法在這裡我只簡要地介紹幾個常用的方法其它的方法請參考附錄中的Java Excel API Document

Workbook類提供的方法

int getNumberOfSheets()
獲得工作薄(Workbook)中工作表(Sheet)的個數示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
int sheets = rwbgetNumberOfSheets();

Sheet[] getSheets()
返回工作薄(Workbook)中工作表(Sheet)對象數組示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
Sheet[] sheets = rwbgetSheets();

String getVersion()
返回正在使用的API的版本號好像是沒什麼太大的作用


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
String apiVersion = rwbgetVersion();

Sheet接口提供的方法

) String getName()
獲取Sheet的名稱示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
String sheetName = rsgetName();

) int getColumns()
獲取Sheet表中所包含的總列數示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
int rsColumns = rsgetColumns();

) Cell[] getColumn(int column)
獲取某一列的所有單元格返回的是單元格對象數組示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
Cell[] cell = rsgetColumn();

) int getRows()
獲取Sheet表中所包含的總行數示例


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
int rsRows = rsgetRows();

) Cell[] getRow(int row)
獲取某一行的所有單元格返回的是單元格對象數組示例子


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
Cell[] cell = rsgetRow();


) Cell getCell(int column int row)
獲取指定單元格的對象引用需要注意的是它的兩個參數第一個是列數第二個是行數這與通常的行列組合有些不同


jxlWorkbook rwb = jxlWorkbookgetWorkbook(new File(sourcefile));
jxlSheet rs = rwbgetSheet();
Cell cell = rsgetCell( );


   生成新的Excel工作薄

下面的代碼主要是向大家介紹如何生成簡單的Excel工作表在這裡單元格的內容是不帶任何修飾的(如字體顏色等等)所有的內容都作為字符串寫入(完整代碼見ExcelWritingjava)

與讀取Excel工作表相似首先要使用Workbook類的工廠方法創建一個可寫入的工作薄(Workbook)對象這裡要注意的是只能通過API 提供的工廠方法來創建Workbook而不能使用WritableWorkbook的構造函數因為類WritableWorkbook的構造函數為 protected類型示例代碼片段如下


import javaio*;
import jxl*;
import jxlwrite*;
… … … …
try
{
//構建Workbook對象 只讀Workbook對象
//Method 創建可寫入的Excel工作薄
    jxlwriteWritableWorkbook wwb = WorkbookcreateWorkbook(new File(targetfile));

//Method 將WritableWorkbook直接寫入到輸出流
/*
    OutputStream os = new FileOutputStream(targetfile);
    jxlwriteWritableWorkbook wwb = WorkbookcreateWorkbook(os);
*/
}
catch (Exception e)
{
eprintStackTrace();
}

API提供了兩種方式來處理可寫入的輸出流一種是直接生成本地文件如果文件名不帶全路徑的話缺省的文件會定位在當前目錄如果文件名帶有全路徑的 話則生成的Excel文件則會定位在相應的目錄另外一種是將Excel對象直接寫入到輸出流例如用戶通過浏覽器來訪問Web服務器如果HTTP 頭設置正確的話浏覽器自動調用客戶端的Excel應用程序來顯示動態生成的Excel電子表格

接下來就是要創建工作表創建工作表的方法與創建工作薄的方法幾乎一樣同樣是通過工廠模式方法獲得相應的對象該方法需要兩個參數一個是工作表的名稱另一個是工作表在工作薄中的位置參考下面的代碼片段


//創建Excel工作表
jxlwriteWritableSheet ws = wwbcreateSheet(Test Sheet );

這鍋也支好了材料也准備齊全了可以開始下鍋了!現在要做的只是實例化API所提供的Excel基本數據類型並將它們添加到工作表中就可以了參考下面的代碼片段


//添加Label對象
jxlwriteLabel labelC = new jxlwriteLabel( This is a Label cell);
wsaddCell(labelC);

//添加帶有字型Formatting的對象
jxlwriteWritableFont wf = new jxlwriteWritableFont(WritableFontTIMES WritableFontBOLD true);
jxlwriteWritableCellFormat wcfF = new jxlwriteWritableCellFormat(wf);
jxlwriteLabel labelCF = new jxlwriteLabel( This is a Label Cell wcfF);
wsaddCell(labelCF);

//添加帶有字體顏色Formatting的對象
jxlwriteWritableFont wfc = new jxlwriteWritableFont(WritableFontARIAL WritableFontNO_BOLD false
UnderlineStyleNO_UNDERLINE jxlformatColourRED);
jxlwriteWritableCellFormat wcfFC = new jxlwriteWritableCellFormat(wfc);
jxlwriteLabel labelCFC = new jxlwriteLabel( This is a Label Cell wcfFC);
wsaddCell(labelCF);

//添加Number對象
jxlwriteNumber labelN = new jxlwriteNumber( );
wsaddCell(labelN);

//添加帶有formatting的Number對象
jxlwriteNumberFormat nf = new jxlwriteNumberFormat(###);
jxlwriteWritableCellFormat wcfN = new jxlwriteWritableCellFormat(nf);
jxlwriteNumber labelNF = new jxlwriteNumber( wcfN);
wsaddCell(labelNF);

//添加Boolean對象
jxlwriteBoolean labelB = new jxlwriteBoolean( false);
wsaddCell(labelB);

//添加DateTime對象
jxlwriteDateTime labelDT = new jxlwriteDateTime( new javautilDate());
wsaddCell(labelDT);

//添加帶有formatting的DateFormat對象
jxlwriteDateFormat df = new jxlwriteDateFormat(dd MM yyyy hh:mm:ss);
jxlwriteWritableCellFormat wcfDF = new jxlwriteWritableCellFormat(df);
jxlwriteDateTime labelDTF = new jxlwriteDateTime( new javautilDate() wcfDF);
wsaddCell(labelDTF);

這裡有兩點大家要引起大家的注意第一點在構造單元格時單元格在工作表中的位置就已經確定了一旦創建後單元格的位置是不能夠變更的盡管單元格的 內容是可以改變的第二點單元格的定位是按照下面這樣的規律(column row)而且下標都是從開始例如A被存儲在( )B被存儲在( )

最後不要忘記關閉打開的Excel工作薄對象以釋放占用的內存參見下面的代碼片段


//寫入Exel工作表
wwbwrite();

//關閉Excel工作薄對象
wwbclose();

這可能與讀取Excel文件的操作有少少不同在關閉Excel對象之前你必須要先調用write()方法因為先前的操作都是存儲在緩存中的所以要通過該方法將操作的內容保存在文件中如果你先關閉了Excel對象那麼只能得到一張空的工作薄了

拷貝更新Excel工作薄

接下來簡要介紹一下如何更新一個已經存在的工作薄主要是下面二步操作第一步是構造只讀的Excel工作薄第二步是利用已經創建的Excel工作薄創建新的可寫入的Excel工作薄參考下面的代碼片段(完整代碼見ExcelModifyingjava)


//創建只讀的Excel工作薄的對象
jxlWorkbook rw = jxlWorkbookgetWorkbook(new File(sourcefile));

//創建可寫入的Excel工作薄對象
jxlwriteWritableWorkbook  wwb = WorkbookcreateWorkbook(new File(targetfile) rw);
            
//讀取第一張工作表
jxlwriteWritableSheet ws = wwbgetSheet();

//獲得第一個單元格對象
jxlwriteWritableCell wc = wsgetWritableCell( );
            
//判斷單元格的類型 做出相應的轉化
if(wcgetType() == CellTypeLABEL)
{
Label l = (Label)wc;
    lsetString(The value has been modified);
}

//寫入Excel對象
wwbwrite();

//關閉可寫入的Excel對象
wwbclose();

//關閉只讀的Excel對象
rwclose();


之所以使用這種方式構建Excel對象完全是因為效率的原因因為上面的示例才是API的主要應用為了提高性能在讀取工作表時與數據相關的一些輸 出信息所有的格式信息字體顏色等等是不被處理的因為我們的目的是獲得行數據的值既使沒有了修飾也不會對行數據的值產生什麼影響唯一的 不利之處就是在內存中會同時保存兩個同樣的工作表這樣當工作表體積比較大時會占用相當大的內存但現在好像內存的大小並不是什麼關鍵因素了

一旦獲得了可寫入的工作表對象我們就可以對單元格對象進行更新的操作了在這裡我們不必調用API提供的add()方法因為單元格已經於工作表當中所以我們只需要調用相應的setXXX()方法就可以完成更新的操作了

盡單元格原有的格式化修飾是不能去掉的我們還是可以將新的單元格修飾加上去以使單元格的內容以不同的形式表現

新生成的工作表對象是可寫入的我們除了更新原有的單元格外還可以添加新的單元格到工作表中這與示例的操作是完全一樣的

最後不要忘記調用write()方法將更新的內容寫入到文件中然後關閉工作薄對象這裡有兩個工作薄對象要關閉一個是只讀的另外一個是可寫入的


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25581.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.