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工作薄对象
jxlwriteWritableWorkbookwwb = 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()方法将更新的内容写入到文件中然后关闭工作薄对象这里有两个工作薄对象要关闭一个是只读的另外一个是可写入的