java使用XSSFWorkbook實(shí)現(xiàn)讀寫(xiě)Excel
寫(xiě)在最前面
使用的是JAVA POI實(shí)現(xiàn)的導(dǎo)出Excel
POI 提供了對(duì)2003版本的Excel的支持 ---- HSSFWorkbook
POI 提供了對(duì)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("")) { // 默認(rèn)取第一個(gè)子表 xssfSheet = xssfWorkbook.getSheetAt(0); } else { xssfSheet = xssfWorkbook.getSheet(sheetName); } List<Map<String, String>> list = new ArrayList<Map<String, String>>(); //定義行 //默認(rèn)第一行為標(biāo)題行,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)取每個(gè)單元格(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)容寫(xiě)入Excel * @param list 傳入要寫(xiě)的內(nèi)容,此處以一個(gè)List內(nèi)容為例,先把要寫(xiě)的內(nèi)容放到一個(gè)list中 * @param outputStream 把輸出流懟到要寫(xiě)入的Excel上,準(zhǔn)備往里面寫(xiě)數(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ù)寫(xiě)到excel中 for (int i=0;i<list.size();i++) { //從第一行開(kāi)始寫(xiě)入 xssfRow = xssfSheet.createRow(i); //創(chuàng)建每個(gè)單元格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)容 } } //用輸出流寫(xiě)到excel try { xssfWorkbook.write(outputStream); outputStream.flush(); outputStream.close(); }catch (IOException e) { e.printStackTrace(); } }
附:把一個(gè)Map中的所有鍵和值分別放到一個(gè)list中,再把這兩個(gè)list整個(gè)放到一個(gè)大的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實(shí)現(xiàn)讀寫(xiě)Excel的文章就介紹到這了,更多相關(guān)java XSSFWorkbook讀寫(xiě)Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
這篇文章主要介紹了詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Java通過(guò)切面實(shí)現(xiàn)統(tǒng)一處理Token設(shè)置用戶信息
這篇文章主要介紹了Java切面統(tǒng)一處理Token設(shè)置用戶信息,常見(jiàn)的后端開(kāi)發(fā)中,接口請(qǐng)求中一般前端都是先通過(guò)用戶登錄獲取token,每次接口請(qǐng)求都需要在頭信息中攜帶token信息,后端每次都需要手動(dòng)處理token信息,從token信息中解析獲取用戶信息,需要的朋友可以參考下2023-10-10一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別
String是不可變的字符序列,而StringBuffer和StringBuilder是可變的字符序列,本文就來(lái)詳細(xì)的介紹一下Java的String、StringBuffer和StringBuilder的使用與區(qū)別,感興趣的可以了解一下2024-03-03java數(shù)據(jù)隨機(jī)分頁(yè)實(shí)現(xiàn)方案
本文主要介紹了java數(shù)據(jù)隨機(jī)分頁(yè)實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06學(xué)習(xí)Java的static與final關(guān)鍵字
本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識(shí)點(diǎn)以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。2018-03-03JAVA中@ApiModel和@ApiModelProperty注解實(shí)戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于JAVA中@ApiModel和@ApiModelProperty注解的相關(guān)資料,@ApiModel注解是用在接口相關(guān)的實(shí)體類上的注解,它主要是用來(lái)對(duì)使用該注解的接口相關(guān)的實(shí)體類添加額外的描述信息,常常和@ApiModelProperty注解配合使用,需要的朋友可以參考下2024-03-03