java使用XSSFWorkbook實現(xiàn)讀寫Excel
寫在最前面
使用的是JAVA POI實現(xiàn)的導(dǎo)出Excel
POI 提供了對2003版本的Excel的支持 ---- HSSFWorkbook
POI 提供了對2007版本以及更高版本的支持 ---- XSSFWorkbook
引入相關(guān)依賴:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
/** * 讀取Excel文件的內(nèi)容 * @param inputStream excel文件,以InputStream的形式傳入 * @param sheetName sheet名字 * @return 以List返回excel中內(nèi)容 */ public static List<Map<String, String>> readExcel(InputStream inputStream, String sheetName) { //定義工作簿 XSSFWorkbook xssfWorkbook = null; try { xssfWorkbook = new XSSFWorkbook(inputStream); } catch (Exception e) { System.out.println("Excel data file cannot be found!"); } //定義工作表 XSSFSheet xssfSheet; if (sheetName.equals("")) { // 默認取第一個子表 xssfSheet = xssfWorkbook.getSheetAt(0); } else { xssfSheet = xssfWorkbook.getSheet(sheetName); } List<Map<String, String>> list = new ArrayList<Map<String, String>>(); //定義行 //默認第一行為標題行,index = 0 XSSFRow titleRow = xssfSheet.getRow(0); //循環(huán)取每行的數(shù)據(jù) for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) { XSSFRow xssfRow = xssfSheet.getRow(rowIndex); if (xssfRow == null) { continue; } Map<String, String> map = new LinkedHashMap<String, String>(); //循環(huán)取每個單元格(cell)的數(shù)據(jù) for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) { XSSFCell titleCell = titleRow.getCell(cellIndex); XSSFCell xssfCell = xssfRow.getCell(cellIndex); map.put(getString(titleCell),getString(xssfCell)); } list.add(map); } return list; } /** * 把單元格的內(nèi)容轉(zhuǎn)為字符串 * @param xssfCell 單元格 * @return 字符串 */ public static String getString(XSSFCell xssfCell) { if (xssfCell == null) { return ""; } if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) { return String.valueOf(xssfCell.getNumericCellValue()); } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) { return String.valueOf(xssfCell.getBooleanCellValue()); } else { return xssfCell.getStringCellValue(); } } /** * 把內(nèi)容寫入Excel * @param list 傳入要寫的內(nèi)容,此處以一個List內(nèi)容為例,先把要寫的內(nèi)容放到一個list中 * @param outputStream 把輸出流懟到要寫入的Excel上,準備往里面寫數(shù)據(jù) */ public static void writeExcel(List<List> list, OutputStream outputStream) { //創(chuàng)建工作簿 XSSFWorkbook xssfWorkbook = null; xssfWorkbook = new XSSFWorkbook(); //創(chuàng)建工作表 XSSFSheet xssfSheet; xssfSheet = xssfWorkbook.createSheet(); //創(chuàng)建行 XSSFRow xssfRow; //創(chuàng)建列,即單元格Cell XSSFCell xssfCell; //把List里面的數(shù)據(jù)寫到excel中 for (int i=0;i<list.size();i++) { //從第一行開始寫入 xssfRow = xssfSheet.createRow(i); //創(chuàng)建每個單元格Cell,即列的數(shù)據(jù) List sub_list =list.get(i); for (int j=0;j<sub_list.size();j++) { xssfCell = xssfRow.createCell(j); //創(chuàng)建單元格 xssfCell.setCellValue((String)sub_list.get(j)); //設(shè)置單元格內(nèi)容 } } //用輸出流寫到excel try { xssfWorkbook.write(outputStream); outputStream.flush(); outputStream.close(); }catch (IOException e) { e.printStackTrace(); } }
附:把一個Map中的所有鍵和值分別放到一個list中,再把這兩個list整個放到一個大的list里面,即 [ [key1,key2,key3...] , [value1,value2,value3...] ]
public static List<List> convertMapToList(Map map) { List<List> list = new ArrayList<List>(); List<String> key_list = new LinkedList<String>(); List<String> value_list = new LinkedList<String>(); Set<Entry<String,String>> set = map.entrySet(); Iterator<Entry<String,String>> iter1 = set.iterator(); while (iter1.hasNext()) { key_list.add(iter1.next().getKey()); } list.add(key_list); Collection<String> value = map.values(); Iterator<String> iter2 = value.iterator(); while (iter2.hasNext()) { value_list.add(iter2.next()); } list.add(value_list); return list; }
到此這篇關(guān)于java使用XSSFWorkbook實現(xiàn)讀寫Excel的文章就介紹到這了,更多相關(guān)java XSSFWorkbook讀寫Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過切面實現(xiàn)統(tǒng)一處理Token設(shè)置用戶信息
這篇文章主要介紹了Java切面統(tǒng)一處理Token設(shè)置用戶信息,常見的后端開發(fā)中,接口請求中一般前端都是先通過用戶登錄獲取token,每次接口請求都需要在頭信息中攜帶token信息,后端每次都需要手動處理token信息,從token信息中解析獲取用戶信息,需要的朋友可以參考下2023-10-10一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別
String是不可變的字符序列,而StringBuffer和StringBuilder是可變的字符序列,本文就來詳細的介紹一下Java的String、StringBuffer和StringBuilder的使用與區(qū)別,感興趣的可以了解一下2024-03-03學(xué)習(xí)Java的static與final關(guān)鍵字
本篇文章給大家詳細分析了Java的static與final關(guān)鍵字知識點以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。2018-03-03JAVA中@ApiModel和@ApiModelProperty注解實戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于JAVA中@ApiModel和@ApiModelProperty注解的相關(guān)資料,@ApiModel注解是用在接口相關(guān)的實體類上的注解,它主要是用來對使用該注解的接口相關(guān)的實體類添加額外的描述信息,常常和@ApiModelProperty注解配合使用,需要的朋友可以參考下2024-03-03