java讀取報表excel示例,java對excel表處理

本文目錄一覽:

java怎麼讀取excel文件

public static void main(String[] args) throws Exception {

File file = new File(“sss.xls”);

String[][] result = getData(file, 1);

int rowLength = result.length;

for(int i=0;irowLength;i++) {

for(int j=0;jresult[i].length;j++) {

System.out.print(result[i][j]+”\t\t”);

}

System.out.println();

}

}

/**

* 讀取Excel的內容,第一維數組存儲的是一行中格列的值,二維數組存儲的是多少個行

* @param file 讀取數據的源Excel

* @param ignoreRows 讀取數據忽略的行數,比喻行頭不需要讀入 忽略的行數為1

* @return 讀出的Excel中數據的內容

* @throws FileNotFoundException

* @throws IOException

*/

public static String[][] getData(File file, int ignoreRows)throws FileNotFoundException, IOException {

ListString[] result = new ArrayListString[]();

int rowSize = 0;

BufferedInputStream in = new BufferedInputStream(new FileInputStream(

file));

// 打開HSSFWorkbook

POIFSFileSystem fs = new POIFSFileSystem(in);

HSSFWorkbook wb = new HSSFWorkbook(fs);

HSSFCell cell = null;

for (int sheetIndex = 0; sheetIndex wb.getNumberOfSheets(); sheetIndex++) {

HSSFSheet st = wb.getSheetAt(sheetIndex);

// 第一行為標題,不取

for (int rowIndex = ignoreRows; rowIndex = st.getLastRowNum(); rowIndex++) {

HSSFRow row = st.getRow(rowIndex);

if (row == null) {

continue;

}

int tempRowSize = row.getLastCellNum() + 1;

if (tempRowSize rowSize) {

rowSize = tempRowSize;

}

String[] values = new String[rowSize];

Arrays.fill(values, “”);

boolean hasValue = false;

for (short columnIndex = 0; columnIndex = row.getLastCellNum(); columnIndex++) {

String value = “”;

cell = row.getCell(columnIndex);

if (cell != null) {

// 注意:一定要設成這個,否則可能會出現亂碼cell.setEncoding(HSSFCell.ENCODING_UTF_16); 3.2已經自動Unicode處理了

switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:

value = cell.getStringCellValue();

break;

case HSSFCell.CELL_TYPE_NUMERIC:

if (HSSFDateUtil.isCellDateFormatted(cell)) {

Date date = cell.getDateCellValue();

if (date != null) {

value = new SimpleDateFormat(“yyyy-MM-dd”).format(date);

} else {

value = “”;

}

} else {

value = new DecimalFormat(“0”).format(cell.getNumericCellValue());

}

break;

case HSSFCell.CELL_TYPE_FORMULA:

// 導入時如果為公式生成的數據則無值

if (!cell.getStringCellValue().equals(“”)) {

value = cell.getStringCellValue();

} else {

value = cell.getNumericCellValue() + “”;

}

break;

case HSSFCell.CELL_TYPE_BLANK:

break;

case HSSFCell.CELL_TYPE_ERROR:

value = “”;

break;

case HSSFCell.CELL_TYPE_BOOLEAN:

value = (cell.getBooleanCellValue() == true ? “Y”: “N”);

break;

default:

value = “”;

}

}

if (columnIndex == 0 value.trim().equals(“”)) {

break;

}

values[columnIndex] = rightTrim(value);

hasValue = true;

}

if (hasValue) {

result.add(values);

}

}

}

in.close();

String[][] returnArray = new String[result.size()][rowSize];

for (int i = 0; i returnArray.length; i++) {

returnArray[i] = (String[]) result.get(i);

}

return returnArray;

}

/**

* 去掉字符串右邊的空格

* @param str 要處理的字符串

* @return 處理後的字符串

*/

public static String rightTrim(String str) {

if (str == null) {

return “”;

}

int length = str.length();

for (int i = length – 1; i = 0; i–) {

if (str.charAt(i) != 0x20) {

break;

}

length–;

}

return str.substring(0, length);

}

之前的一個例子,你看看應該有幫助!

如何用java讀取excel中的數據?下面的例子不能讀出自己寫的excel數據

使用java poi

package webservice;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelController {

@SuppressWarnings(“deprecation”)

public void excel() throws FileNotFoundException, IOException{

String filename = “d:\\excel.xls”;

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filename));

//按名引用excel工作表

// HSSFSheet sheet = workbook.getSheet(“JSP”);

//也可以用以下方式來獲取excel的工作表,採用工作表的索引值

HSSFSheet sheet = workbook.getSheetAt(0);

HSSFRow row ;

HSSFCell cell1;

int rows=sheet.getLastRowNum();

for(int icount=0;icountrows;icount++){

row = sheet.getRow(icount);

int line=row.getPhysicalNumberOfCells();

for(int j=0;jline;j++){

cell1= row.getCell(j);

System.out.println(cell1+”–“+icount+”—“+j);

}

}

//打印讀取值

// System.out.println(cell.getStringCellValue());

//新建一輸出流

FileOutputStream fout = new FileOutputStream(filename); //PS:filename 是你另存為的路徑,不處理直接寫入模版文件

//存盤

workbook.write(fout);

fout.flush();

//結束關閉

fout.close();

}

public HSSFCell getCell(HSSFRow row, int index) {

// 取得分發日期單元格

HSSFCell cell = row.getCell(index);

// 如果單元格不存在

if (cell == null) {

// 創建單元格

cell = row.createCell(index);

}

// 返回單元格

return cell;

}

public static void main(String[] args) {

ExcelController ec = new ExcelController();

try {

ec.excel();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

java如何讀取excel中報表(柱狀圖)的信息

public class Report {

/**作用:報表樣式的枚舉,該類的getvalue方法返回對應值。br

* Columns_2DVer:2D柱狀垂直報表。br

* Columns_3DVer:3D柱狀垂直報表。br

* Columns_2DHor:2D柱狀水平報表。br

* Columns_3DHor:3D柱狀水平報表。

* */

public enum ReportType{

Columns_2DVer(“Z2DV”),

Columns_3DVer(“Z3DV”),

Columns_2DHor(“Z2DH”),

Columns_3DHor(“Z3DH”),

LineReport_2D(“Line2D”),

LineReport_3D(“Line3D”),

PieReport_2D(“Pie2D”),

PieReport_3D(“Pie3D”);

private ReportType(String a){

this.str=a;

}

private String str;

public String getvalue(){

return this.str;

}

}

/**作用:作為創建報表時的參數。br

* 成員1:報表的標題。br

* 成員2:報表的橫坐標標題。br

* 成員3:報表的縱坐標標題。br

* 成員4:JSP頁面的request對象。br

* 成員5:報表所保存的文件名。br

* 成員6:報表的長度。br

* 成員7:報表的寬度。br

* 成員8:報表的背景顏色,默認為白色。br

* 成員9:報表網格中豎線的顏色,默認為黑色。br

* 成員10:報表網格中橫線的顏色,默認為黑色。br

* 成員11:報表橫軸內容的數組。br

* 成員12:報表縱軸內容的list數組。br

* 成員13:提示信息。如果寫入多個提示信息,報表就變成多柱狀。br

* 成員14:報表的模式。詳見reportType枚舉類br

* 成員15:餅狀圖專用的數值數組。數組的和必須等於1.br

* 注意1:要在JSP頁面引入該類型才能使用,橫縱軸數組的長度必須一致。br

* 注意2:如果在提示信息數組中寫入了多個提示信息,那麼報表縱軸內容的

* list中就必須存放入和它數量一致的int數組。否則會出錯。

* */

public class ReportClass{

public String ReportTitle;

public String xTitle;

public String yTitle;

public HttpServletRequest request;

public String filename;

public int width;

public int height;

public Color BackgroundColor=Color.WHITE;

public Color ylineColor=Color.BLACK;

public Color xlineColor=Color.BLACK;

public String[] xValues;

public ArrayListint[] yValue=new ArrayListint[]();

public String[] helpstr;

public String reportType;

public double[] PieValue;

}

/**作用:創建一個指定類型和數據的圖表。br

* 參數1:ReportClass類型,各成員具體作用參見ReportClass說明br

* 返回值:String類型,在JSP頁面可以直接out.println顯示圖形。br

* 注意1:ReportClass類型中,必須設置的成員主要有:br

* 1、ReportTitle 2、request 3、filename 4、width 5、height 6、reportTypebr

* 注意2:如果要生成餅狀圖,還需要設置:br

* 1、xValues 2、PieValue 這兩個數組的長度必須一致br

* 注意3:如果要生成柱狀圖或折線圖,還需要設置:br

* 1、xValues 2、yValue 3、helpstrbr

* yvalue數組總和必須等於1.即100%.br

* 如果要生成多柱狀或折線圖,則需要設置helpstr長度。br

* yvalue列表的長度必須和helpstr數組長度一致。br

* yvalue中的成員數組的長度必須和xvalue數組長度一致。

* */

public String CreateReport(ReportClass rc){

String s=”sf”;

String str=””;

JFreeChart jc=null;

Font titlefont=new Font(“宋體”,Font.BOLD,20);

Font tickfont=new Font(“宋體”,0,15);

Font labelfont=new Font(“宋體”,Font.BOLD,15);

DefaultCategoryDataset ds=null;

DefaultPieDataset pds=null;

if (rc.ReportTitle!=null){

if (rc.reportType.indexOf(“Pie”)!=-1){//餅狀圖

pds=new DefaultPieDataset();

double[] ob=rc.PieValue;

for (int i=0;iob.length;i++){

pds.setValue(rc.xValues[i], ob[i]);

}

if (rc.ReportTitle!=null){

if (rc.reportType.equals(“Pie2D”)){

jc=ChartFactory.createPieChart(rc.ReportTitle,pds,true, true, false);

}

else if (rc.reportType.equals(“Pie3D”)){

jc=ChartFactory.createPieChart3D(rc.ReportTitle,pds,true, true, false);

}

jc.getTitle().setFont(titlefont);

jc.getLegend().setItemFont(labelfont);

jc.setBackgroundPaint(rc.BackgroundColor);//總背景色

jc.setBorderPaint(rc.BackgroundColor);

PiePlot plot=(PiePlot)jc.getPlot();

plot.setBackgroundPaint(rc.BackgroundColor);

plot.setLabelFont(new Font(“宋體”,0,15));

}

}

else { //柱狀或折線圖

ds=new DefaultCategoryDataset();

for (int i=0;irc.helpstr.length;i++){

int[] ob=rc.yValue.get(i);

for (int j=0;job.length;j++){

ds.addValue(ob[j], rc.helpstr[i], rc.xValues[j]);

}

}

if (rc.reportType.indexOf(“Z2D”)!=-1){

PlotOrientation po=null;

if (rc.reportType.indexOf(“V”)!=-1){

po=PlotOrientation.VERTICAL;

}

else if (rc.reportType.indexOf(“H”)!=-1){

po=PlotOrientation.HORIZONTAL;

}

jc=ChartFactory.createBarChart(rc.ReportTitle, rc.xTitle, rc.yTitle,

ds, po, true, true, false);

}

else if (rc.reportType.indexOf(“Z3D”)!=-1){

PlotOrientation po=null;

if (rc.reportType.indexOf(“V”)!=-1){

po=PlotOrientation.VERTICAL;

}

else if (rc.reportType.indexOf(“H”)!=-1){

po=PlotOrientation.HORIZONTAL;

}

jc=ChartFactory.createBarChart3D(rc.ReportTitle, rc.xTitle, rc.yTitle,

ds, po, true, true, false);

}

else if (rc.reportType.equals(“Line2D”)){

PlotOrientation po=PlotOrientation.VERTICAL;

jc=ChartFactory.createLineChart(rc.ReportTitle, rc.xTitle, rc.yTitle,

ds, po, true, true, false);

}

else if (rc.reportType.equals(“Line3D”)){

PlotOrientation po=PlotOrientation.VERTICAL;

jc=ChartFactory.createLineChart3D(rc.ReportTitle, rc.xTitle, rc.yTitle,

ds, po, true, true, false);

}

jc.getTitle().setFont(titlefont);

jc.getLegend().setItemFont(labelfont);

jc.setBackgroundPaint(rc.BackgroundColor);//總背景色

CategoryPlot cp=jc.getCategoryPlot();

cp.setBackgroundPaint(rc.BackgroundColor);//圖形框架背景色

cp.setDomainGridlinePaint(rc.ylineColor);//圖形背景網格中豎線的顏色

cp.setDomainGridlinesVisible(true);

cp.setRangeGridlinePaint(rc.xlineColor);//圖形背景網格中橫線的顏色

cp.getDomainAxis().setTickLabelFont(tickfont);

cp.getDomainAxis().setLabelFont(labelfont);

cp.getRangeAxis().setTickLabelFont(tickfont);

cp.getRangeAxis().setLabelFont(labelfont);

}

try {

File ff=new File(rc.request.getRealPath(“/”)+”file”);

if (!ff.exists()){

ff.mkdir();

}

File file=new File(rc.request.getRealPath(“/”)+”file/”+rc.filename);

if (!file.exists()){

file.createNewFile();

}

ChartUtilities.saveChartAsJPEG(file, jc, rc.width, rc.height);

str=”img src='”+file.getPath()+”‘”;

return str;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return null;

}

}

else {

return null;

}

}

}

以前寫的一個報表的集成,可以生成任何形式的報表,要引入JFreeChar.你可以慢慢研究下…

java 讀取excel並設置各列數據的類型

import java.io.*;

import jxl.*;

… … … …

try

{

//構建Workbook對象, 只讀Workbook對象

//直接從本地文件創建Workbook

//從輸入流創建Workbook

InputStream is = new FileInputStream(sourcefile);

jxl.Workbook rwb = Workbook.getWorkbook(is);

}

catch (Exception e)

{

e.printStackTrace();

}

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

//獲取第一張Sheet表

Sheet rs = rwb.getSheet(0);

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

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

//獲取第一行,第一列的值

Cell c00 = rs.getCell(0, 0);

String strc00 = c00.getContents();

//獲取第一行,第二列的值

Cell c10 = rs.getCell(1, 0);

String strc10 = c10.getContents();

//獲取第二行,第二列的值

Cell c11 = rs.getCell(1, 1);

String strc11 = c11.getContents();

System.out.println(“Cell(0, 0)” + ” value : ” + strc00 + “; type : ” +

c00.getType());

System.out.println(“Cell(1, 0)” + ” value : ” + strc10 + “; type : ” +

c10.getType());

System.out.println(“Cell(1, 1)” + ” value : ” + strc11 + “; type : ” +

c11.getType());

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

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

String strc00 = null;

double strc10 = 0.00;

Date strc11 = null;

Cell c00 = rs.getCell(0, 0);

Cell c10 = rs.getCell(1, 0);

Cell c11 = rs.getCell(1, 1);

if(c00.getType() == CellType.LABEL)

{

LabelCell labelc00 = (LabelCell)c00;

strc00 = labelc00.getString();

}

if(c10.getType() == CellType.NUMBER)

{

NmberCell numc10 = (NumberCell)c10;

strc10 = numc10.getValue();

}

if(c11.getType() == CellType.DATE)

{

DateCell datec11 = (DateCell)c11;

strc11 = datec11.getDate();

}

System.out.println(“Cell(0, 0)” + ” value : ” + strc00 + “; type : ” +

c00.getType());

System.out.println(“Cell(1, 0)” + ” value : ” + strc10 + “; type : ” +

c10.getType());

System.out.println(“Cell(1, 1)” + ” value : ” + strc11 + “; type : ” +

c11.getType());

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

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

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

//操作完成時,關閉對象,釋放佔用的內存空間

rwb.close();

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

Workbook類提供的方法

1. int getNumberOfSheets()

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

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

int sheets = rwb.getNumberOfSheets();

2. Sheet[] getSheets()

返回工作薄(Workbook)中工作表(Sheet)對象數組,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

Sheet[] sheets = rwb.getSheets();

3. String getVersion()

返回正在使用的API的版本號,好像是沒什麼太大的作用。

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

String apiVersion = rwb.getVersion();

Sheet接口提供的方法

1. String getName()

獲取Sheet的名稱,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

String sheetName = rs.getName();

2. int getColumns()

獲取Sheet表中所包含的總列數,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

int rsColumns = rs.getColumns();

3. Cell[] getColumn(int column)

獲取某一列的所有單元格,返回的是單元格對象數組,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

Cell[] cell = rs.getColumn(0);

4. int getRows()

獲取Sheet表中所包含的總行數,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

int rsRows = rs.getRows();

5. Cell[] getRow(int row)

獲取某一行的所有單元格,返回的是單元格對象數組,示例子:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

Cell[] cell = rs.getRow(0);

6. Cell getCell(int column, int row)

獲取指定單元格的對象引用,需要注意的是它的兩個參數,第一個是列數,第二個是行數,這與通常的行、列組合有些不同。

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));

jxl.Sheet rs = rwb.getSheet(0);

Cell cell = rs.getCell(0, 0);

生成新的Excel工作薄

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

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

import java.io.*;

import jxl.*;

import jxl.write.*;

… … … …

try

{

//構建Workbook對象, 只讀Workbook對象

//Method 1:創建可寫入的Excel工作薄

jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));

//Method 2:將WritableWorkbook直接寫入到輸出流

/*

OutputStream os = new FileOutputStream(targetfile);

jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);

*/

}

catch (Exception e)

{

e.printStackTrace();

}

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

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

//創建Excel工作表

jxl.write.WritableSheet ws = wwb.createSheet(“Test Sheet 1”, 0);

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

//1.添加Label對象

jxl.write.Label labelC = new jxl.write.Label(0, 0, “This is a Label cell”);

ws.addCell(labelC);

//添加帶有字型Formatting的對象

jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18,

WritableFont.BOLD, true);

jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);

jxl.write.Label labelCF = new jxl.write.Label(1, 0, “This is a Label Cell”,

wcfF);

ws.addCell(labelCF);

//添加帶有字體顏色Formatting的對象

jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10,

WritableFont.NO_BOLD, false,

UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);

jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);

jxl.write.Label labelCFC = new jxl.write.Label(1, 0, “This is a Label Cell”,

wcfFC);

ws.addCell(labelCF);

//2.添加Number對象

jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);

ws.addCell(labelN);

//添加帶有formatting的Number對象

jxl.write.NumberFormat nf = new jxl.write.NumberFormat(“#.##”);

jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);

jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);

ws.addCell(labelNF);

//3.添加Boolean對象

jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);

ws.addCell(labelB);

//4.添加DateTime對象

jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());

ws.addCell(labelDT);

//添加帶有formatting的DateFormat對象

jxl.write.DateFormat df = new jxl.write.DateFormat(“dd MM yyyy hh:mm:ss”);

jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);

jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(),

wcfDF);

ws.addCell(labelDTF);

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

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

//寫入Exel工作表

wwb.write();

//關閉Excel工作薄對象

wwb.close();

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

拷貝、更新Excel工作薄

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

//創建只讀的Excel工作薄的對象

jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));

//創建可寫入的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);

//判斷單元格的類型, 做出相應的轉化

if(wc.getType() == CellType.LABEL)

{

Label l = (Label)wc;

l.setString(“The value has been modified.”);

}

//寫入Excel對象

wwb.write();

//關閉可寫入的Excel對象

wwb.close();

//關閉只讀的Excel對象

rw.close();

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

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

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

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

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

小結

本文只是對Java Excel API中常用的方法作了介紹,要想更詳盡地了解API,請大家參考API文檔,或源代碼。Java Excel API是一個開放源碼項目,請大家關注它的最新進展,有興趣的朋友也可以申請加入這個項目,或者是提出寶貴的意見。

怎樣用java.jxl實現讀取excel的數據?求具體代碼(以讀取3列為例)

import java.io.File;

import java.io.IOException;

import jxl.Cell;

import jxl.Sheet;

import jxl.Workbook;

import jxl.read.biff.BiffException;

public class MyExcel {

public static void main(String[] args) {

try {

Workbook workbook = Workbook.getWorkbook(new File(“C:\\myfile.xls”));

Sheet sheet = workbook.getSheet(0);//使用第一個工作表

int colnum = sheet.getColumns();//獲取列數,如果一定要3列,直接改3就行

int row = sheet.getRows();//獲取行數

StringBuffer sb = new StringBuffer();

for(int i=0;irow;i++){

for(int j=0;jcolnum;j++){

Cell c = sheet.getCell(j,i);//獲得單元數據

sb.append(c.getContents()+”\n”);

}

}

workbook.close();

System.out.println(sb);

} catch (BiffException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

這個寫法有很多種,這裡只是給您參考。要讀取內容關鍵是以下幾步:

1.創建一個可讀取的excel文件對象

Workbook workbook = Workbook.getWorkbook(new File(“C:\\myfile.xls”));//注意文件路徑

2.獲取工作表

Sheet sheet = workbook.getSheet(0);//使用第一個工作表

3.獲取單元格數據,我的例子里是通過循環獲取所有的數據

sheet.getCell(j,i);

4.最後把獲取的數據做你所需要的處理。

sb.append(c.getContents()+”\n”);//我這裡把它加到了StringBuffer里。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301562.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論