在上一篇介紹了使用POI來讀取.xls文檔的數據,本文要介紹的是對Excel表進行修改。由於Excel文檔有.xls和.xlsx兩種格式,所以這次使用.xlsx來進行測試。
首先還是先創建一個測試用的Excel表,在本地磁盤E盤下創建一個名稱爲“學生表.xlsx”的文件,這裏偷個懶,只使用一張Sheet表,該表的結構和數據如下:
很簡單的一張表,現在我要做的是修改A1和B1兩個單元格的內容,把A1的內容修改爲“一班學號”,B1的內容修改爲“一班學生姓名”。
先說一下操作的步驟:
1、從磁盤中讀入“學生表.xlsx”;
2、按要求進行修改;
3、把修改後的表格寫回到磁盤。
下面上代碼(關鍵代碼已經寫了註釋,請各位看官細看):
package com.spareyaya.de;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelXlsxTest {
public ExcelXlsxTest() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
ExcelXlsxTest ext = new ExcelXlsxTest();
File file = new File("E:/學生表.xlsx");
try {
ext.writeData(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeData(File file) throws IOException {
//因爲是修改已有的文檔,所以首先要把文檔讀取進來
InputStream is = new FileInputStream(file);
XSSFWorkbook wb = new XSSFWorkbook(is);
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row = sheet.getRow(0);
//這裏注意是使用createCell而不是getCell,因爲需要需要第一個工作表的第一行
//第一列和第二列的單元格,所以create一個單元格,並且設置該單元格的內容
XSSFCell cell = row.createCell(0);
//設置內容爲“一班學號”
cell.setCellValue("一班學號");
cell = row.createCell(1);
//設置內容爲“一班學生姓名”
cell.setCellValue("一班學生姓名");
//把修改寫入到文件中
OutputStream os = new FileOutputStream(file);
wb.write(os);
os.close();
}
}
執行等結果。這裏需要注意一下,在執行時不要打開該文件,否則會報以下的錯誤:
這是多進程使用公共資源常見的問題,不明白原理的看官請去查閱操作系統的相關資料,這裏不贅述。
好了,下面就是見證奇蹟的時刻!
謝謝各位,貌似我又成功了!
總結:在這裏想說的一點就是,當對某個單元格進行修改時,用的是createCell方法,你可以理解爲你先創建了一個單元格並且設置好這個單元格的內容和其他一些樣式等屬性,然後把這個新建的單元格替換掉原來的單元格。同理,如果想替換一行的話就是用createRow方法,再寫完這一行的數據。