Java操作Excel表(一) 首次原始碼分析和初次讀寫操作
前言
前段時間一直想著用Python來操作Excel表,但是發現自己由于長期使用Java,C++這種語法型別的語言后,實在是難以適應Python的語法,最后決定還是來用Java操作,在網上看到有一些jar包可以實作,于是我就去Maven網站上找了一下,導下依賴吧,
由于我也是第一次接觸這個jar包,所以今天想先看一下原始碼和它的功能再來研究怎么使用,如果理解錯了還望指出,多多交流,^_^
不想看原始碼想撿現成的可以直接翻到最下面^_^
看原始碼最快也最直接的方式就是把注釋和方法名稱,變數名稱翻譯了,英語不好的同學最好建議下載一個有道詞典
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
Workbook類
英文意思是(計算機上面的作業簿),這個類表示作業簿,包含各種工廠方法并提供提供對作業表訪問的各種訪問器,
public abstract class Workbook
{
/**
* 軟體的當前版本
*/
private static final String VERSION = "2.6.12";
/**
* 建構式
*/
protected Workbook() { }
/**
* 獲取此作業簿中的作業表,使用此方法為大型作業表可能導致性能問題,
* @return 回傳單個表的陣列
*/
public abstract Sheet[] getSheets();
/**
* 獲取表單名稱
* @return 包含作業表名稱的字串陣列
*/
public abstract String[] getSheetNames();
/**
獲取此作業簿中的指定作業表如隨附的技術說明所述,每次通話
getSheet強制重新讀取作業表(出于記憶體原因),因此,不要對這個方法進行不必要的呼叫,此外,
在客戶端代碼中不保留對Sheets的不必要的參考,如這將阻止垃圾回收器釋放記憶體
@param index reQuired表的零索引
@return索引指定的作業表
*/
public abstract Sheet getSheet(int index)
throws IndexOutOfBoundsException;
/**
從作業簿中獲取具有指定名稱的作業表,如隨附的技術說明所述,每次通話
getSheet強制重新讀取作業表(出于記憶體原因),因此,不要對這個方法進行不必要的呼叫,此外,
在客戶端代碼中不保留對Sheets的不必要的參考,如這將阻止垃圾回收器釋放記憶體
@param name表名
@return指定名稱的作業表,如果沒有找到則為空
*/
public abstract Sheet getSheet(String name);
/**
* 軟體版本的訪問器
* @return the version
*/
public static String getVersion()
{
return VERSION;
}
/**
* 回傳此作業簿中的作業表數目
* @return 此作業簿中的作業表數目
*/
public abstract int getNumberOfSheets();
/**
從作業簿獲取命名單元格,如果這個名字指的是范圍的單元格,則回傳左上角的單元格,如果
無法找到名稱,回傳null,
這是一個方便的函式,可以快速訪問內容的單細胞,如果您需要進一步的資訊(如
作業表或范圍內相鄰的單元格)使用功能更豐富的方法,findByName,它回傳一個范圍串列
@param name要搜索的單元格名稱/范圍
*/
public abstract Cell findCellByName(String name);
/**
回傳指定位置的單元格,“Sheet1 ! A4”,這與使用CellReferenceHelper與它的
相關的性能開銷,因此它應該要節約使用
@param loc要檢索的單元格
@return指定位置的單元格
*/
public abstract Cell getCell(String loc);
/**
從該作業簿獲取指定的范圍,Range物件回傳
包含從左上到右下的所有單元格
范圍的*,
如果指定的范圍包含相鄰的范圍,
Range[]將包含一個物件;對不相鄰的范圍時,必須回傳長度大于1的陣列,
*如果指定范圍包含單個單元格,則左上角和
*右下角的單元格將是相同的單元格
* @param name要搜索的單元格名稱/范圍
* @回傳單元格的范圍,如果范圍不存在則為NULL
*/
public abstract Range[] findByName(String name);
/**
* 獲取命名范圍
* @return 回傳作業簿中命名單元格的串列
*/
public abstract String[] getRangeNames();
/**
* 確定作業表是否受保護
* @return TRUE 如果作業簿受到保護,則為FALSE
*/
public abstract boolean isProtected();
/**
*決議excel檔案,
*如果作業簿是密碼保護的,則拋出PasswordException
*如果API的消費者希望以特定的方式處理這個問題
* @exception BiffException
* @exception PasswordException
*/
protected abstract void parse() throws BiffException, PasswordException;
/**
*關閉該作業簿,釋放任何分配的記憶體
*用于垃圾收集
*/
public abstract void close();
/**
*一個工廠方法,它接受一個excel檔案并讀取其中的內容,
* @exception IOException
* @exception BiffException
* @param檔案excel 97電子表格決議
* @return作業簿實體
*/
public static Workbook getWorkbook(java.io.File file)
throws IOException, BiffException
{
return getWorkbook(file, new WorkbookSettings());
}
/**
*一個工廠方法,它接受一個excel檔案并讀取其中的內容,
* @exception IOException
* @exception BiffException
* @param檔案excel 97電子表格決議
* @param ws作業簿的設定
* @return作業簿實體
*/
public static Workbook getWorkbook(java.io.File file, WorkbookSettings ws)
throws IOException, BiffException
{
FileInputStream fis = new FileInputStream(file);
//始終關閉輸入流,不管是否
//檔案可以被決議感謝Steve Hahn
File dataFile = null;
try
{
dataFile = new File(fis, ws);
}
catch (IOException e)
{
fis.close();
throw e;
}
catch (BiffException e)
{
fis.close();
throw e;
}
fis.close();
Workbook workbook = new WorkbookParser(dataFile, ws);
workbook.parse();
return workbook;
}
/**
*一個工廠方法,它接受一個excel檔案并讀取其中的內容,
* @param是一個開放的流,這是excel 97電子表格要決議
* @return作業簿實體
* @exception IOException
* @exception BiffException
*/
public static Workbook getWorkbook(InputStream is)
throws IOException, BiffException
{
return getWorkbook(is, new WorkbookSettings());
}
/**
*一個工廠方法,它接受一個excel檔案并讀取其中的內容,
* @param是一個開放的流,這是excel 97電子表格要決議
* @param ws作業簿的設定
* @return作業簿實體
* @exception IOException
* @exception BiffException
*/
public static Workbook getWorkbook(InputStream is, WorkbookSettings ws)
throws IOException, BiffException
{
File dataFile = new File(is, ws);
Workbook workbook = new WorkbookParser(dataFile, ws);
workbook.parse();
return workbook;
}
/**
*使用給定的檔案名創建一個可寫的作業簿
* @param檔案的作業簿復制
* @回傳一個可寫的作業簿
* @exception IOException
*/
public static WritableWorkbook createWorkbook(java.io.File file)
throws IOException
{
return createWorkbook(file, new WorkbookSettings());
}
/**
*使用給定的檔案名創建一個可寫的作業簿
* @param file要復制的檔案
* @param ws全域作業簿設定
* @回傳一個可寫的作業簿
* @exception IOException
*/
public static WritableWorkbook createWorkbook(java.io.File file,
WorkbookSettings ws)
throws IOException
{
FileOutputStream fos = new FileOutputStream(file);
WritableWorkbook w = new WritableWorkbookImpl(fos, true, ws);
return w;
}
/**
創建一個可寫的作業簿與給定的檔案名作為副本通過的作業簿,一旦創建,可寫的內容作業簿可能被修改
@param file復制的輸出檔案
@param在作業簿中復制
@回傳一個可寫的作業簿
@exception IOException
*/
public static WritableWorkbook createWorkbook(java.io.File file,
Workbook in)
throws IOException
{
return createWorkbook(file, in, new WorkbookSettings());
}
/**
創建一個可寫的作業簿與給定的檔案名作為副本通過的作業簿,一旦創建,可寫的內容作業簿可能被修改
@param file復制的輸出檔案
@param在作業簿中復制
@param ws此作業簿的配置
@回傳一個可寫的作業簿
*/
public static WritableWorkbook createWorkbook(java.io.File file,
Workbook in,
WorkbookSettings ws)
throws IOException
{
FileOutputStream fos = new FileOutputStream(file);
WritableWorkbook w = new WritableWorkbookImpl(fos, in, true, ws);
return w;
}
/**
創建一個可寫的作業簿作為副本通過的作業簿,一旦創建,可寫的內容作業簿可能被修改
@param OS要寫入的流
@param在作業簿中復制
@回傳一個可寫的作業簿
@exception IOException
*/
public static WritableWorkbook createWorkbook(OutputStream os,
Workbook in)
throws IOException
{
return createWorkbook(os, in, ((WorkbookParser) in).getSettings());
}
/**
創建一個可寫的作業簿作為副本通過的作業簿,一旦創建,可寫的內容作業簿可能被修改
@param OS要寫入的輸出流
@param在作業簿中復制
@param ws此作業簿的配置
@回傳一個可寫的作業簿
@exception IOException
*/
public static WritableWorkbook createWorkbook(OutputStream os,
Workbook in,
WorkbookSettings ws)
throws IOException
{
WritableWorkbook w = new WritableWorkbookImpl(os, in, false, ws);
return w;
}
/**
創建可寫的作業簿,當作業簿關閉時,它將直接流到輸出流,在這個
方式,一個生成的excel電子表格可以傳遞一個servlet到瀏覽器通過HTTP
@param OS輸出流
@回傳可寫的作業簿
@exception IOException
*/
public static WritableWorkbook createWorkbook(OutputStream os)
throws IOException
{
return createWorkbook(os, new WorkbookSettings());
}
/**
創建可寫的作業簿,當作業簿關閉時,它將直接流到輸出流,在這個
方式,一個生成的excel電子表格可以傳遞一個servlet到瀏覽器通過HTTP
@param OS輸出流
@param ws此作業簿的配置
@回傳可寫的作業簿
@exception IOException
*/
public static WritableWorkbook createWorkbook(OutputStream os,
WorkbookSettings ws)
throws IOException
{
WritableWorkbook w = new WritableWorkbookImpl(os, false, ws);
return w;
}
}
WritableWorkbook類
這個類的英文是 Writable Workbook "可寫的作業簿",可見這個類是用來實作寫操作的
public abstract class WritableWorkbook{
/**
* 單元格格式的默認字體
*/
public static final WritableFont ARIAL_10_PT =
new WritableFont(WritableFont.ARIAL);
/**
* 用于超鏈接的字體
*/
public static final WritableFont HYPERLINK_FONT =
new WritableFont(WritableFont.ARIAL,
WritableFont.DEFAULT_POINT_SIZE,
WritableFont.NO_BOLD,
false,
UnderlineStyle.SINGLE,
Colour.BLUE);
/**
* 單元格的默認樣式
*/
public static final WritableCellFormat NORMAL_STYLE =
new WritableCellFormat(ARIAL_10_PT, NumberFormats.DEFAULT);
/**
* 用于超鏈接的樣式
*/
public static final WritableCellFormat HYPERLINK_STYLE =
new WritableCellFormat(HYPERLINK_FONT);
/**
* 用于隱藏單元格內容的單元格格式
*/
public static final WritableCellFormat HIDDEN_STYLE =
new WritableCellFormat(new DateFormat(";;;"));
/**
* 由實作類使用的建構式
*/
protected WritableWorkbook()
{
}
/**
*獲取此作業簿中的作業表,使用此方法為
*大的作業表會導致性能問題,
* @return單個表的陣列
*/
public abstract WritableSheet[] getSheets();
/**
*獲取表單名稱
* @return一個包含作業表名稱的字串陣列
*/
public abstract String[] getSheetNames();
/**
*獲取此作業簿中的指定作業表
* @param index reQuired表的零索引
* @return索引指定的作業表
* @exception indexoutofboundexception當index指向一個不存在的物件時
*/
public abstract WritableSheet getSheet(int index)
throws IndexOutOfBoundsException;
/**
*從作業簿中獲取具有指定名稱的作業表
* @param name表名
* @return指定名稱的作業表,如果沒有找到則為空
*/
public abstract WritableSheet getSheet(String name);
/**
*回傳指定位置的單元格,“Sheet1 ! A4”,這與使用CellReferenceHelper與它的
*相關的性能開銷,因此它應該要節約使用
* @param loc要檢索的單元格
* @return指定位置的單元格
*/
public abstract WritableCell getWritableCell(String loc);
/**
*回傳作業簿中的作業表數量
* @回傳作業簿中的作業表數量
*/
public abstract int getNumberOfSheets();
/**
*關閉此作業簿,并使分配的任何記憶體可用
*用于垃圾收集,也關閉底層的輸出流,如果有必要,
* @exception IOException
* @exception WriteException
*/
public abstract void close() throws IOException, WriteException;
/**
*創建并回傳指定位置的作業表
*與指定的名稱
*如果指定的索引小于或等于0,則新作業表
在作業簿的開頭創建,如果索引更大
*大于作業表的數量,則作業表在
*作業簿的結束,
* @param name表名
* @param index插入的索引號
* @return new sheet
*/
public abstract WritableSheet createSheet(String name, int index);
/**
*從不同的作業簿匯入作業表,所有的都是深層拷貝嗎
*元素
* @param name新作業表的名稱
* @param索引新作業表在作業簿中的位置
* @param作業表(從另一個作業簿)合并到這個作業表
* @return new sheet
*/
public abstract WritableSheet importSheet(String name, int index, Sheet s);
/**
*在同一作業簿內的復制頁,指定的作業表被復制到
*該位置的新作業表名稱
* @param是要復制的頁的索引
* @param name新作業表的名稱
* @param索引新作業表的位置
*/
public abstract void copySheet(int s, String name, int index);
/**
*復制指定的作業表并將其放在索引處
*由引數指定
* @param是要復制的表格的名稱
* @param name新作業表的名稱
* @param索引新作業表的位置
*/
public abstract void copySheet(String s, String name, int index);
/**
*從作業簿中洗掉指定索引處的作業表
* @param index要洗掉的表索引
*/
public abstract void removeSheet(int index);
/**
*將作業簿中的指定作業表移動到另一個索引*位置,
* @param from mindex所需表的零基礎索引
* @param toIndex要求的作業表的零基礎索引
* @回傳已移動的表
*/
public abstract WritableSheet moveSheet(int fromIndex, int toIndex);
/**
*以Excel格式寫出作業簿中保存的資料
* @exception IOException
*/
public abstract void write() throws IOException;
/**
*指示該作業簿是否受保護
* @param prot受保護標志
*/
public abstract void setProtected(boolean prot);
/**
*設定作業簿的指定顏色的RGB值
* @param c要覆寫其RGB值的顏色
* @param r紅色部分設定(0-255)
* @param g綠色部分設定(0-255)
* @param b藍色部分設定(0-255)
*/
public abstract void setColourRGB(Colour c, int r, int g, int b);
/**
*該方法可用于創建其他可寫克隆
*作業簿
* @param w workdock to copy
復制現在作為多載的一部分隱式發生
*工廠方法workbook . createworkbook
*/
public void copy(Workbook w)
{
//是一個抽象的方法——將方法主體留空嗎
}
/**
*從作業簿獲取命名單元格,這個名字指的是一個
*范圍的單元格,則回傳左上角的單元格,如果
*名稱不能為,回傳null
* @param name要搜索的單元格名稱/范圍
* @回傳范圍左上角的單元格,如果找到,NULL
*/
public abstract WritableCell findCellByName(String name);
/**
*從該作業簿獲取指定的范圍,Range物件回傳
*包含從左上到右下的所有單元格范圍的*,
*如果指定的范圍包含相鄰的范圍,
* Range[]將包含一個物件;對不相鄰的
*范圍時,必須回傳長度大于1的陣列
*如果指定范圍包含單個單元格,則左上角和
*右下角的單元格將是相同的單元格
* @param name要搜索的單元格名稱/范圍
回傳單元格的范圍
*/
public abstract Range[] findByName(String name);
/**
*獲取命名范圍
* @回傳作業簿中命名單元格的串列
*/
public abstract String[] getRangeNames();
/**
*從作業簿中移除指定的命名范圍,請注意,
洗掉名稱可能導致使用該名稱的公式
錯誤地計算結果
* @param name要洗掉的名稱
*/
public abstract void removeRangeName(String name);
/**
*添加新命名區域到作業簿與給定的資訊,
* @param name要創建的名稱,
* @param sheet包含名稱的表
* @param firstCol此名稱所指的第一列,
* @param firstRow這個名稱所指的第一行,
* @param lastCol此名稱所指的最后一列,
* @param lastRow這個名稱所指的最后一行,
*/
public abstract void addNameArea(String name,
WritableSheet sheet,
int firstCol,
int firstRow,
int lastCol,
int lastRow);
/**
設定一個新的輸出檔案,這允許使用相同的作業簿
*寫入各種不同的輸出檔案而不必
*再次讀入任何模板
* @param fileName檔案名
* @exception IOException
*/
public abstract void setOutputFile(java.io.File fileName)
throws IOException;
}
Sheet
表示作業簿中的作業表,為個人提供句柄單元格或單元格行(按行或列分組)
public interface Sheet
{
/**
*回傳在這行和這列指定的單元格,如果一個列/行組合是合并單元格組的一部分然后
(除非它是組的第一個單元格)一個空白單元格將被退回
* @param column列號
* @param row行號
* @return指定坐標的單元格
*/
public Cell getCell(int column, int row);
/**
*回傳指定位置的單元格,“A4”,請注意,這
*方法與呼叫getCell(CellReferenceHelper.getColumn(loc)相同,
* CellReferenceHelper.getRow(loc))及其隱式性能
*字串決議的開銷,因此,這種方法應該
要節約使用
* @param loc單元格參考
* @return指定坐標的單元格
*/
public Cell getCell(String loc);
/**
*回傳此作業表中的行數
* @回傳本表的行數
*/
public int getRows();
/**
*回傳此作業表的列數
* @回傳本頁的列數
*/
public int getColumns();
/**
*回傳*中的列數獲取指定行的所有單元格
* @param row要回傳單元格的行
* @return表中給定行上的單元格
* @回傳本頁的列數
*/
public Cell[] getRow(int row);
/**
*獲取指定列上的所有單元格
* @param col要回傳的單元格的列
* @return指定列上的單元格
*/
public Cell[] getColumn(int col);
/**
*獲取指定列上的所有單元格
* @param col the column獲取作業表的名稱
* @return要回傳單元格的表名
* @return指定列上的單元格
*/
public String getName();
/**
*確定作業表是否被隱藏
* @回傳是否隱藏表
* @ getSettings()方法已棄用
*/
public boolean isHidden();
/**
*確定作業表是否受保護
* @回傳表是否受保護
* @ getSettings()方法已棄用
*/
public boolean isProtected();
/**
*獲取其內容與傳入字串匹配的單元格,如果沒有找到匹配,則回傳null,搜索被執行
*以行為單位,所以行數越低,越多演算法將有效執行
* @param內容要匹配的字串
* @return其內容與引數匹配的Cell,如果沒有找到則為空
*/
public Cell findCell(String contents);
/**
*獲取其內容與傳入字串匹配的單元格,如果沒有找到匹配,則回傳null,搜索被執行
*以行為單位,所以行數越低,越多演算法將有效執行
* @param內容要匹配的字串
* @param firstCol范圍內的第一列
* @param firstRow范圍的第一行
* @param lastCol范圍內的最后一列
* @param lastRow范圍內的最后一行
* @param reverse表示是否執行反向搜索
* @return其內容與引數匹配的Cell,如果沒有找到則為空
*/
public Cell findCell(String contents,
int firstCol,
int firstRow,
int lastCol,
int lastRow,
boolean reverse);
/**
*獲取其內容與傳入的正則運算式字串匹配的單元格,如果沒有找到匹配,則回傳null,搜索被執行
*以行為單位,所以行數越低,越多演算法將有效執行
* @param pattern匹配的正則運算式字串
* @param firstCol范圍內的第一列
* @param firstRow表示陣列的第一行
* @param lastCol范圍內的最后一列
* @param lastRow范圍內的最后一行
* @param reverse表示是否執行反向搜索
* @return其內容與引數匹配的Cell,如果沒有找到則為空
*/
public Cell findCell(Pattern pattern,
int firstCol,
int firstRow,
int lastCol,
int lastRow,
boolean reverse);
/**
*獲取其內容與傳入字串匹配的單元格,如果沒有找到匹配,則回傳null,搜索被執行
*以行為單位,所以行數越低,越多演算法將有效執行,該方法不同
在findCell方法中,只有帶標簽的單元格是查詢-所有數字單元被忽略,這應該提高性能,
* @param contents the string to match
* @return 內容與引數匹配的Cell,如果沒有找到則為空
*/
public LabelCell findLabelCell(String contents);
/**
*獲取此作業表上的超鏈接
* @return一個超鏈接陣列
*/
public Hyperlink[] getHyperlinks();
/**
*獲取已在此作業表中合并的單元格
* @return range物件的陣列
*/
public Range[] getMergedCells();
/**
*獲取在特定作業表上使用的設定
* @回傳作業表設定
*/
public SheetSettings getSettings();
/**
*獲取指定列的列格式
* @param col列號
* @回傳列的格式,如果列沒有特定的格式,則回傳NULL
* @deprecated使用getColumnView和CellView bean代替
*/
public CellFormat getColumnFormat(int col);
/**
*獲取指定列的列寬度
* @param col列號
* @return列寬度,如果列沒有寬度,則為默認寬度
* 指定的格式
* @deprecated使用getColumnView代替
*/
public int getColumnWidth(int col);
/**
*獲取指定列的列寬度
* @param col列號
* @return列格式,如果沒有覆寫,則回傳默認格式
指定的
*/
public CellView getColumnView(int col);
/**
*獲取指定列的行高
* @param row行號
* @return行高度,如果列沒有高度,則回傳默認高度
* 指定的格式
* @deprecated使用getRowView代替
*/
public int getRowHeight(int row);
/**
*獲取指定列的行高
* @param row行號
* @return行格式,如果沒有格式,可能是默認格式
* 指定
*/
public CellView getRowView(int row);
/**
*訪問表上的影像數量
* @回傳本頁圖片的數量
*/
public int getNumberOfImages();
/**
*影像訪問器
* @param I基于0的影像編號
* @return指定位置的影像
*/
public Image getDrawing(int i);
/**
*此頁上分頁符的訪問器
* @return本頁的分頁符
*/
public int[] getRowPageBreaks();
/**
*此頁上分頁符的訪問器
* @return本頁的分頁符
*/
public int[] getColumnPageBreaks();
}
原始碼看完了,簡單操作感受一下
物體類
為了方便最后發送Json給前端,所以這里就弄個物體類,把Excel當成資料庫來用
class ExcelDo{
private String userName; //姓名
private String company; //公司
}//記得get set
讀取操作
由于讀取Excel表,由于讀出來的都是根據列的順序來,為了不寫一大堆的if,故使用回圈來搞定,為了防止回圈導致的陣列越界,封裝了一個輔助方法,第一次寫,如果有更好的方法還望多多指教
/**
* 讀取操作
* @throws IOException
* @throws BiffException
*/
public List<ExcelDo> getExcelList() throws IOException, BiffException {
List<ExcelDo> excelDoList = new ArrayList<ExcelDo>(); //創建串列
File xlsFile = new File("E:/ExcelProject/test.xls"); //檔案目錄
Workbook workbook = Workbook.getWorkbook(xlsFile); //獲得作業簿物件
Sheet sheet = workbook.getSheet(0); //獲得作業表
int rows = sheet.getRows(); //獲得行
int cols = sheet.getColumns(); //獲得列
int index = 0;
for(int i = 0; i < rows; i++){ //讀取資料
index = 0;
ExcelDo excelDo = new ExcelDo();
excelDo.setUserName(sheet.getCell(index,i).getContents());
index = getIndex(index,cols); //每次添加完都呼叫一次
excelDo.setCompany(sheet.getCell( index,i).getContents());
excelDoList.add(excelDo); //保存到串列中最后用來回傳
}
workbook.close();
return excelDoList;
}
/**
* 回圈時定義坐標,防止坐標越界 用于 輔助 getExcelList()
* @param index
* @param col
* @return
*/
private Integer getIndex(int index, int col){
index++;
if(index > col){
index = col;
}
return index;
}
測驗
public static void main(String[] args) throws IOException, BiffException{
ExcelService excelService = new ExcelServiceImpl();
List<ExcelDo> excelList = excelService.getExcelList();
for(ExcelDo excelDo : excelList){
System.out.println(excelDo.toString());
}
}
寫操作
/**
* 添加資料
* @param row 行數
* @param col 列數
* @param data 資料
* @throws IOException
* @throws WriteException
*/
public void writeExcel(int row, int col,String data) throws IOException, WriteException {
File xlsFile = new File("E:/ExcelProject/alvin.xls");
// 創建一個作業簿
WritableWorkbook workbook = Workbook.createWorkbook(xlsFile);
// 創建一個作業表
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
sheet.addCell(new Label(col, row, data));
workbook.write();
workbook.close();
}
測驗
public static void main(String[] args) throws IOException, BiffException, WriteException {
ExcelService excelService = new ExcelServiceImpl();
excelService.writeExcel(2,2,"alvin");
}
完整代碼
package com.alvin.service.impl;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.alvin.domain.ExcelDo;
import com.alvin.service.ExcelService;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.Sheet;
public class ExcelServiceImpl implements ExcelService{
/**
* 添加資料
* @param row 行數
* @param col 列數
* @param data 資料
* @throws IOException
* @throws WriteException
*/
public void writeExcel(int row, int col,String data) throws IOException, WriteException {
File xlsFile = new File("E:/ExcelProject/alvin.xls");
// 創建一個作業簿
WritableWorkbook workbook = Workbook.createWorkbook(xlsFile);
// 創建一個作業表
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
sheet.addCell(new Label(col, row, data));
workbook.write();
workbook.close();
}
/**
* 讀取操作
* @throws IOException
* @throws BiffException
*/
public List<ExcelDo> getExcelList() throws IOException, BiffException {
List<ExcelDo> excelDoList = new ArrayList<ExcelDo>(); //創建串列
File xlsFile = new File("E:/ExcelProject/test.xls"); //檔案目錄
Workbook workbook = Workbook.getWorkbook(xlsFile); //獲得作業簿物件
Sheet sheet = workbook.getSheet(0); //獲得作業表
int rows = sheet.getRows(); //獲得行
int cols = sheet.getColumns(); //獲得列
int index = 0;
for(int i = 0; i < rows; i++){ //讀取資料
index = 0;
ExcelDo excelDo = new ExcelDo();
excelDo.setUserName(sheet.getCell(index,i).getContents());
index = getIndex(index,cols); //每次添加完都呼叫一次
excelDo.setCompany(sheet.getCell( index,i).getContents());
excelDoList.add(excelDo); //保存到串列中最后用來回傳
}
workbook.close();
return excelDoList;
}
/**
* 回圈時定義坐標,防止坐標越界 用于 輔助 getExcelList()
* @param index
* @param col
* @return
*/
private Integer getIndex(int index, int col){
index++;
if(index > col){
index = col;
}
return index;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356127.html
標籤:python
