使用POI來實現對Excel的讀寫操作,poi實現excel讀寫
其實我感覺直接貼代碼就好了。代碼裡面幾乎做到每一行一個注釋。應該看起來會比較簡單
代碼託管在github上:https://github.com/chsj1/ExcelUtils
package com.hjd.poiutils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.math.BigDecimal;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.TreeMap;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellStyle;import org.apache.poi.ss.usermodel.Font;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class ExcelUtils {public static final String HEADERINFO = "headInfo";public static final String DATAINFON = "dataInfo";/** * * @Title: getWeebWork * @Description: TODO(根據傳入的檔案名稱擷取活頁簿對象(Workbook)) * @param filename * @return * @throws IOException */public static Workbook getWeebWork(String filename) throws IOException {Workbook workbook = null;if (null != filename) {String fileType = filename.substring(filename.lastIndexOf("."),filename.length());FileInputStream fileStream = new FileInputStream(new File(filename));if (".xls".equals(fileType.trim().toLowerCase())) {workbook = new HSSFWorkbook(fileStream);// 建立 Excel 2003 活頁簿對象} else if (".xlsx".equals(fileType.trim().toLowerCase())) {workbook = new XSSFWorkbook(fileStream);// 建立 Excel 2007 活頁簿對象}}return workbook;}/** * * @Title: writeExcel * @Description: TODO(匯出Excel表) * @param pathname * :匯出Excel表的檔案路徑 * @param map * :封裝需要匯出的資料(HEADERINFO封裝表頭資訊,DATAINFON:封裝要匯出的資料資訊,此處需要使用TreeMap * ) 例如: map.put(ExcelUtil.HEADERINFO,List<String> headList); * map.put(ExcelUtil.DATAINFON,List<TreeMap<String,Object>> * dataList); * @param wb * @throws IOException */public static void writeExcel(String pathname, Map<String, Object> map,Workbook wb) throws IOException {if (null != map && null != pathname) {List<Object> headList = (List<Object>) map.get(ExcelUtils.HEADERINFO);List<TreeMap<String, Object>> dataList = (List<TreeMap<String, Object>>) map.get(ExcelUtils.DATAINFON);CellStyle style = getCellStyle(wb);Sheet sheet = wb.createSheet();// 在文檔對象中建立一個表單..預設是表單名字是Sheet0、Sheet1....// Sheet sheet = wb.createSheet("hell poi");//在建立愛你表單的時候指定表單的名字/** * 設定Excel表的第一行即表頭 */Row row = sheet.createRow(0);for (int i = 0; i < headList.size(); i++) {Cell headCell = row.createCell(i);headCell.setCellType(Cell.CELL_TYPE_STRING);// 設定這個儲存格的資料的類型,是文本類型還是數字類型headCell.setCellStyle(style);// 設定表頭樣式headCell.setCellValue(String.valueOf(headList.get(i)));// 給這個儲存格設定值}for (int i = 0; i < dataList.size(); i++) {Row rowdata = sheet.createRow(i + 1);// 建立資料行TreeMap<String, Object> mapdata = dataList.get(i);Iterator it = mapdata.keySet().iterator();int j = 0;while (it.hasNext()) {String strdata = String.valueOf(mapdata.get(it.next()));Cell celldata = rowdata.createCell(j);// 在一行中建立某列..celldata.setCellType(Cell.CELL_TYPE_STRING);celldata.setCellValue(strdata);j++;}}// 檔案流File file = new File(pathname);OutputStream os = new FileOutputStream(file);os.flush();wb.write(os);os.close();}}/** * * @Title: getCellStyle * @Description: TODO(設定表頭樣式) * @param wb * @return */public static CellStyle getCellStyle(Workbook wb) {CellStyle style = wb.createCellStyle();Font font = wb.createFont();font.setFontName("宋體");font.setFontHeightInPoints((short) 12);// 設定字型大小font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗style.setFillForegroundColor(HSSFColor.LIME.index);// 設定背景色style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setAlignment(HSSFCellStyle.SOLID_FOREGROUND);// 讓儲存格置中// style.setWrapText(true);//設定自動換行style.setFont(font);return style;}/** * * @Title: readerExcelDemo * @Description: TODO(讀取Excel表中的資料) * @throws IOException */public static void readFromExcelDemo() throws IOException {/** * 讀取Excel表中的所有資料 */Workbook workbook = getWeebWork("E:/test.xlsx");System.out.println("總表頁數為:" + workbook.getNumberOfSheets());// 擷取表頁數Sheet sheet = workbook.getSheetAt(0);// Sheet sheet = workbook.getSheetAt(1);int rownum = sheet.getLastRowNum();// 擷取總行數for (int i = 0; i <= rownum; i++) {Row row = sheet.getRow(i);Cell orderno = row.getCell(2);// 擷取指定儲存格中的資料// System.out.println(orderno.getCellType());//這個列印的是cell的typeshort cellnum = row.getLastCellNum(); // 擷取儲存格的總列數for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {Cell celldata = row.getCell(j);System.out.print(celldata + "\t");}System.out.println();}/** * 讀取指定位置的儲存格 */// Row row1 = sheet.getRow(1);// Cell cell1 = row1.getCell(2);// System.out.print("(1,2)位置儲存格的值為:"+cell1);// BigDecimal big = new// BigDecimal(cell1.getNumericCellValue());//將科學計數法表示的資料轉化為String類型// System.out.print("\t"+String.valueOf(big));}public static void readFromExcelDemo1() throws IOException {/** * 讀取Excel表中的所有資料 * * Workbook: excel的文檔對象 sheet: excel的表單 row: excel中的行 cell: excel中的儲存格子 * */Workbook workbook = getWeebWork("E:/test.xlsx");System.out.println("總表頁數為:" + workbook.getNumberOfSheets());// 擷取表頁數// Sheet sheet =workbook.getSheetAt(0);Sheet sheet = workbook.getSheetAt(2);// 擷取第二個表單int rownum = sheet.getLastRowNum();// 擷取總行數for (int i = 0; i <= rownum; i++) {Row row = sheet.getRow(i);// 擷取表達的第i行// Cell orderno =// row.getCell(2);//擷取指定儲存格中的資料(擷取一行中的第2列(這裡的2指的是0,1,2.排在第三位))// System.out.println(orderno.getCellType());//這個列印的是cell的type// short cellnum=row.getLastCellNum();// //擷取儲存格的總列數(擷取一行中有多少個儲存格(也就是多少列))/** * row.getFirstCellNum(): 擷取行的第一個儲存格的位置 row.getLastCellNum(): * 擷取行的最後一個儲存格的位置 */for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {// 遍曆一行中的所有列Cell celldata = row.getCell(j);// 擷取一行中的第j列返回Cell類型的資料System.out.print(celldata + "\t");//}// 列印指定列// Cell celldata = row.getCell(4);//擷取這一行中的第4列(在第5個位置上)// System.out.print( "\"" + celldata+"\",");System.out.println();}/** * 讀取指定位置的儲存格 */// Row row1 = sheet.getRow(1);// Cell cell1 = row1.getCell(2);// System.out.print("(1,2)位置儲存格的值為:"+cell1);// BigDecimal big = new// BigDecimal(cell1.getNumericCellValue());//將科學計數法表示的資料轉化為String類型// System.out.print("\t"+String.valueOf(big));}public static void readFromExcelDemo(String fileAbsolutePath) throws IOException {/** * 讀取Excel表中的所有資料 */Workbook workbook = getWeebWork(fileAbsolutePath);System.out.println("總表頁數為:" + workbook.getNumberOfSheets());// 擷取表頁數Sheet sheet = workbook.getSheetAt(0);// Sheet sheet = workbook.getSheetAt(1);int rownum = sheet.getLastRowNum();// 擷取總行數for (int i = 0; i <= rownum; i++) {Row row = sheet.getRow(i);Cell orderno = row.getCell(2);// 擷取指定儲存格中的資料// System.out.println(orderno.getCellType());//這個列印的是cell的typeshort cellnum = row.getLastCellNum(); // 擷取儲存格的總列數for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {Cell celldata = row.getCell(j);System.out.print(celldata + "\t");}System.out.println();}/** * 讀取指定位置的儲存格 */// Row row1 = sheet.getRow(1);// Cell cell1 = row1.getCell(2);// System.out.print("(1,2)位置儲存格的值為:"+cell1);// BigDecimal big = new// BigDecimal(cell1.getNumericCellValue());//將科學計數法表示的資料轉化為String類型// System.out.print("\t"+String.valueOf(big));}public static void main(String[] args) throws IOException {// readFromExcelDemo1();//String filePath = "E:/test.xlsx";//readFromExcelDemo(filePath);//從一個指定的excel檔案中讀取內容//writeToExcelDemo();}public static void writeToExcelDemo() throws IOException {/** * HSSF: .xls XSSF: .xlsx 所以大家會在官網中看到Excel = HSSF+XSSF * * HSSF是POI工程對Excel 97(-2007)檔案操作的純Java實現 XSSF是POI工程對Excel 2007 OOXML * (.xlsx)檔案操作的純Java實現 * * 從POI 3.8版本開始,提供了一種基於XSSF的低記憶體佔用的API----SXSSF * */Workbook wb = new XSSFWorkbook();// 建立一個新的excel的文檔對象Map<String, Object> map = new HashMap<String, Object>();List headList = new ArrayList();// 表頭資料headList.add("下單時間");headList.add("結賬時間");headList.add("訂單編號");headList.add("訂單金額");headList.add("使用者名稱");// excel的都/** * TreeMap基於紅/黑樹狀結構實現 */List dataList = new ArrayList();// 表格內的資料for (int i = 0; i < 15; i++) {TreeMap<String, Object> treeMap = new TreeMap<String, Object>();// 此處的資料必須為有序資料,所以使用TreeMap進行封裝treeMap.put("m1", "2013-10-" + i + 1);treeMap.put("m2", "2013-11-" + i + 1);treeMap.put("m3", "20124" + i + 1);treeMap.put("m4", 23.5 + i + 1);treeMap.put("m5", "張三_" + i);dataList.add(treeMap);}/* * 先不要加上以下這一段,否則以下錯誤: Cannot get a numeric value from a text * cell(不能從一個text cell中擷取數字類型的資料) * * 解決辦法: http://blog.csdn.net/ysughw/article/details/9288307 */// TreeMap<String,Object> treeMap1 = new TreeMap<String, Object>();// treeMap1.put("asd", null);// treeMap1.put("豬頭", "zhutou");// dataList.add(treeMap1);map.put(ExcelUtils.HEADERINFO, headList);map.put(ExcelUtils.DATAINFON, dataList);writeExcel("E:/test1.xlsx", map, wb);//往wb裡面寫map中內容,產生E:/test1.xlsx這個檔案....}}
用java的poi類讀取一個excel表格的內容後再寫入到一個新excel表格中的完整代碼
你是想讀取一個excel內容,然後整合一下裡面資料,然後再產生一個新的excel吧。
package aa;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
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;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
//你是想讀取一個excel內容,然後整合一下裡面資料,然後再產生一個新的excel吧。
public class A {
public static void main(String[] args) throws Exception{
//讀取excel:
InputStream is = new FileInputStream("d:\\test2.xls");
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs);
//讀取sheet,讀取sheet裡面第一行第一列內容
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short) 0);
String s = cell.getStringCellValue();
System.out.println(s);
//...內容組合自己玩~
//比如上面組合好了一個String S2
//寫入一個excel 比如 test3.xls
FileOutputStream fos = new FileOutputStream("d:\\test3.xls");
HSSFWorkbook wb2 = new HSSFWorkbook();
HSSFSheet hsSheet = wb2.createSheet("TestReport");
HSSFRow hsRow1 = hsSheet.createRow(0);//建行
hsRow1.setHeight((short) 500);
HSSFCell hsCell11 = hsRow1.createCell((short) 0);
hsCell11.setEncoding(HSSFCell.ENCODING_UTF_16);
hsCell11.setCellValue(s+"TESTVALUE&quo......餘下全文>>
用java實現excel的讀取,用的是eclipse?
eclipse只是一個編輯代碼的軟體而已,不管你用什麼,那怕你直接建立一個.txt文檔,改成.java尾碼,用jdk編譯運行照樣可以運行代碼。
你所謂的用java讀取excel,是用第三方jar包。有兩種可選擇:
一種是jxl.jar包:只提供03版及其以下版本的excel讀寫操作。
另一種是poi.jar包:這種提供07版及其以上版本的excel讀寫操作。
個人認為poi包用起來更方便,提供了大量介面實現對每個儲存格的操作,比如背景顏色,字型及大小等等。
看你需求是對什麼版本的excel操作。
如有不懂,請追問
希望能夠幫到你