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("")) {
// 默認(rèn)取第一個子表
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)取每個單元格(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上,準(zhǔn)備往里面寫數(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是可變的字符序列,本文就來詳細(xì)的介紹一下Java的String、StringBuffer和StringBuilder的使用與區(qū)別,感興趣的可以了解一下2024-03-03
java數(shù)據(jù)隨機(jī)分頁實現(xiàn)方案
本文主要介紹了java數(shù)據(jù)隨機(jī)分頁實現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
學(xué)習(xí)Java的static與final關(guān)鍵字
本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識點以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。2018-03-03
JAVA中@ApiModel和@ApiModelProperty注解實戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于JAVA中@ApiModel和@ApiModelProperty注解的相關(guān)資料,@ApiModel注解是用在接口相關(guān)的實體類上的注解,它主要是用來對使用該注解的接口相關(guān)的實體類添加額外的描述信息,常常和@ApiModelProperty注解配合使用,需要的朋友可以參考下2024-03-03

