java jxl 写 excel_Java 操作Excel(jxl读和写)
一.讀操作:
package com.jxl.opr;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class ReadExcelUtil {
public static void readExcel(String
sourceFile){
Workbook wb = null;
try {
InputStream is = new
FileInputStream(sourceFile);
//1.讀取 Excel 數(shù)據(jù)表的第一步是創(chuàng)建
Workbook( 術(shù)語:工作薄 ),
wb =
Workbook.getWorkbook(is);
//2.一旦創(chuàng)建了 Workbook,我們就可以通過它來訪問
Excel Sheet( 術(shù)語:工作表 )。
// 獲取第一張 Sheet 表
Sheet sheet =
wb.getSheet(0);
//3.我們既可能通過 Sheet
的名稱來訪問它,也可以通過下標(biāo)來訪問它。如果通過下標(biāo)來訪問的話,要注意的一點(diǎn)是下標(biāo)從 0 開始,就像數(shù)組一樣。
//一旦得到了 Sheet,我們就可以通過它來訪問 Excel Cell( 術(shù)語:單元格 )。
//獲取第一行,第一列的值
Cell c00 = sheet.getCell(0,
0);
String strC00 =
c00.getContents();
//獲取第一行,第二列的值
Cell c10 =
sheet.getCell(1,0);
String strC10 =
c10.getContents();
System.out.println("Cell(0, 0)"
+ " value : " + strC00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)"
+ " value : " + strC10 + "; type : " + c10.getType());
//循環(huán)Excel中所有的內(nèi)容
int rows =
sheet.getRows();
for(int
i=0;i
Cell[] cell =
sheet.getRow(i);
System.out.println("第"+(i+1)+"行:");
for(Cell
curCell : cell){
System.out.print("?"+curCell.getContents());
}
System.out.println();
}
//1. int
getNumberOfSheets()
//獲得工作薄(Workbook)中工作表(Sheet)的個數(shù)
int sheetCount =
wb.getNumberOfSheets();
System.out.println("sheetCount:"+sheetCount);
//2. Sheet[] getSheets()
//返回工作薄(Workbook)中工作表(Sheet)對象數(shù)組,示例:
Sheet[] sheetArr =
wb.getSheets();
System.out.println("sheetArr:"+Arrays.toString(sheetArr));
//3. String
getVersion()
//返回正在使用的 API 的版本號
String apiVersion =
wb.getVersion();
System.out.println("apiVersion:"+apiVersion);
//4) int getColumns()
//獲取 Sheet 表中所包含的總列數(shù),示例:
int rsColumns =
sheet.getColumns();
System.out.println("rsColumns:"+rsColumns);
//5) int getRows()
//獲取 Sheet 表中所包含的總行數(shù),示例:
int rsRows =
sheet.getRows();
System.out.println("rsRows:"+rsRows);
//6) Cell[] getRow(int
row)
//獲取某一行的所有單元格,返回的是單元格對象數(shù)組,示例子:
Cell[] cell
= sheet.getRow(0);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(wb!=null){
//
操作完成時,關(guān)閉對象,釋放占用的內(nèi)存空間
wb.close();
}
}
}
}
測試類:
package com.jxl.opr;
public class JavaExcelTest {
public static void main(String[] args) {
ReadExcelUtil.readExcel("e:/test.xls");
//WriteExcelUtil.writeExcel("e:/account.xls");
}
}
讀取的Excel文件:
讀取結(jié)果:
Cell(0, 0) value : 姓名; type : Label
Cell(1, 0) value : 年齡; type : Label
第1行:
姓名?年齡?地址?職位
第2行:
李四?23?上海?工程師
第3行:
張三?24?深圳?醫(yī)生
sheetCount:3
sheetArr:[jxl.read.biff.SheetImpl@fa9cf, jxl.read.biff.SheetImpl@55571e,
jxl.read.biff.SheetImpl@ca8327]
apiVersion:2.6.3
rsColumns:4
rsRows:3
二.寫操作package com.jxl.opr;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Colour;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class WriteExcelUtil {
public static void writeExcel(String targetfile)
{
WritableWorkbook wwb =
null;
try {
// 構(gòu)建
Workbook 對象 , 只讀 Workbook 對象
// Method
1:創(chuàng)建可寫入的 Excel 工作薄
wwb =
Workbook.createWorkbook(new File(targetfile));
// Method 2:將
WritableWorkbook 直接寫入到輸出流
// 創(chuàng)建 Excel
工作表
WritableSheet
wSheet = wwb.createSheet("集中錄入數(shù)據(jù)統(tǒng)計", 0);
//字形
WritableFont
font1 = new
WritableFont(WritableFont.ARIAL,10,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLUE);
WritableFont
font2 = new WritableFont(WritableFont.ARIAL,8);
WritableCellFormat
cf1 = new WritableCellFormat(font1);
WritableCellFormat
cf2 = new WritableCellFormat(font2);
// 1. 添加
Label 對象
Label c00 =
new Label(0, 0, "柜員號",cf1);
wSheet.addCell(c00);
Label c10 =
new Label(1, 0, "雙人錄入1",cf1);
wSheet.addCell(c10);
Label c20 =
new Label(2, 0, "雙人錄入2",cf1);
wSheet.addCell(c20);
Label c30 =
new Label(3, 0, "統(tǒng)計時間",cf1);
wSheet.addCell(c30);
jxl.write.Number
c01 = new jxl.write.Number(0, 1, 8111002,cf2);
wSheet.addCell(c01);
jxl.write.Number
c11 = new jxl.write.Number(1, 1, 1590,cf2);
wSheet.addCell(c11);
jxl.write.Number
c21 = new jxl.write.Number(2, 1, 2309,cf2);
wSheet.addCell(c21);
jxl.write.DateFormat
df = new jxl.write.DateFormat("yyyy-MM-dd hh:mm:ss");
jxl.write.WritableCellFormat
wcfDF = new jxl.write.WritableCellFormat(df);
DateTime c31
=?new DateTime(3,1,new Date(),wcfDF);
wSheet.addCell(c31);
//
注意加上這句話,寫入 Exel 工作表
//在關(guān)閉 Excel
對象之前,你必須要先調(diào)用 write()
方法,因?yàn)橄惹暗牟僮鞫际谴鎯υ诰彺嬷械?#xff0c;所以要通過該方法將操作的內(nèi)容保存在文件中。如果你先關(guān)閉了 Excel
對象,那么只能得到一張空的工作薄了。
wwb.write();
} catch (Exception e)
{
e.printStackTrace();
} finally {
// 關(guān)閉 Excel
工作薄對象
try {
if(wwb!=null){
wwb.close();
}
} catch
(WriteException e) {
e.printStackTrace();
} catch
(IOException e) {
e.printStackTrace();
}
}
}
}
寫的結(jié)果:
三 讀取合并單元格
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import jxl.Range;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class ExcelReader {
public static void readExcel(String
excelFileName)throws BiffException,IOException{
Workbook rwb = null;
//創(chuàng)建輸入流
InputStream stream = new
FileInputStream(excelFileName);
//獲取Excel文件對象
rwb =
Workbook.getWorkbook(stream);
//選擇第一個工作表
Sheet sheet =
rwb.getSheet(0);
//獲取合并單元格的信息
Range[] ranges =
sheet.getMergedCells();
for(int
j=1;j
for(int
k=0;k
String
str = null;
str
= sheet.getCell(k,j).getContents();
for(Range
r:ranges){
//如果剛好是合并的單元格的后面幾行,則取第一行的信息
if(j
> r.getTopLeft().getRow()
&& j <=
r.getBottomRight().getRow() && k ==
r.getTopLeft().getColumn()){
str
=
sheet.getCell(r.getTopLeft().getColumn(),r.getTopLeft().getRow()).getContents();
}
}
System.out.print("第"+j+"行,第"+k+"列的值:"+str+"\t");?}
System.out.println("");
}
}
public static void main(String[] args){
try {
ExcelReader.readExcel("e:/test.xls");//文件存放地址
} catch (BiffException e)
{
// TODO
Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
}
讀取的Excel:
輸出結(jié)果:
第1行,第0列的值:039001?第1行,第1列的值:S10030?第1行,第2列的值:F10001?第1行,第3列的值:5?第1行,第4列的值:Combo?第2行,第0列的值:039001?第2行,第1列的值:S10030?第2行,第2列的值:F10002?第2行,第3列的值:30?第2行,第4列的值:Text?第3行,第0列的值:039002?第3行,第1列的值:S10031?第3行,第2列的值:F10003?第3行,第3列的值:30?第3行,第4列的值:Text
這種情況未做例子,從網(wǎng)上摘錄以下信息,供參考
如何更新一個已經(jīng)存在的工作薄,主要是下面二步操作,第一步是構(gòu)造只讀的 Excel 工作薄,第二步是利用已經(jīng)創(chuàng)建的 Excel
工作薄創(chuàng)建新的可寫入的 Excel 工作薄,參考下面的代碼片段:( 完整代碼見 ExcelModifying.java)
// 創(chuàng)建只讀的 Excel 工作薄的對象
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
// 創(chuàng)建可寫入的 Excel 工作薄對象
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile), rw);
// 讀取第一張工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);
// 獲得第一個單元格對象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
// 判斷單元格的類型 , 做出相應(yīng)的轉(zhuǎn)化
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
l.setString("The value has been modified.");
}
// 寫入 Excel 對象
wwb.write();
// 關(guān)閉可寫入的 Excel 對象
wwb.close();
// 關(guān)閉只讀的 Excel 對象
rw.close();
之所以使用這種方式構(gòu)建 Excel 對象,完全是因?yàn)樾实脑?#xff0c;因?yàn)樯厦娴氖纠攀?API
的主要應(yīng)用。為了提高性能,在讀取工作表時,與數(shù)據(jù)相關(guān)的一些輸出信息,所有的格式信息,如:字體、顏色等等,是不被處理的,因?yàn)槲覀兊哪康氖谦@得行數(shù)據(jù)的值,既使沒有了修飾,也不會對行數(shù)據(jù)的值產(chǎn)生什么影響。唯一的不利之處就是,在內(nèi)存中會同時保存兩個同樣的工作表,這樣當(dāng)工作表體積比較大時,會占用相當(dāng)大的內(nèi)存,但現(xiàn)在好像內(nèi)存的大小并不是什么關(guān)鍵因素了。
一旦獲得了可寫入的工作表對象,我們就可以對單元格對象進(jìn)行更新的操作了,在這里我們不必調(diào)用 API 提供的 add()
方法,因?yàn)閱卧褚呀?jīng)于工作表當(dāng)中,所以我們只需要調(diào)用相應(yīng)的 setXXX() 方法,就可以完成更新的操作了。
盡單元格原有的格式化修飾是不能去掉的,我們還是可以將新的單元格修飾加上去,以使單元格的內(nèi)容以不同的形式表現(xiàn)。
新生成的工作表對象是可寫入的,我們除了更新原有的單元格外,還可以添加新的單元格到工作表中,這與示例 2
的操作是完全一樣的。
最后,不要忘記調(diào)用 write()
方法,將更新的內(nèi)容寫入到文件中,然后關(guān)閉工作薄對象,這里有兩個工作薄對象要關(guān)閉,一個是只讀的,另外一個是可寫入的。
總結(jié)
以上是生活随笔為你收集整理的java jxl 写 excel_Java 操作Excel(jxl读和写)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis java应用_Java+Re
- 下一篇: dapper 连接mysql_如何在.N