JAVA將一個字符串數(shù)組直接寫入csv文件比較容易扒吁,直接用jar包javacsv里的CsvWriter類就可以了,具體用法如下:
1.首先在pom中引入jar包(為了方便管理拐叉,我用的maven常遂,當然你也可以直接在lib中加入此包诫给,maven的具體用法我稍后整理完發(fā)布镀钓。)
<dependencies>
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
2.然后就可以利用引用的類完成寫入了,比如:
public static void writeList(String[] fileList) throws IOException {
CsvWriter cw = new CsvWriter("jobList.csv", ',', Charset.forName("utf8"));
String headers = new String[]{"姓名","語文","數(shù)學"};
cw.writeRecord(headers);//寫入最上面的一行標題
for (String file : fileList) {
cw.writeRecord(new String[]{file});
ArrayList<String[]> jobList = fileParsing(new File(JOB_FOLDER + "\\" + file));
//此處fileParsing是一個將JOB_FOLDER這個文件里所有文件的內(nèi)容讀取到一個list的方法祭务,有空再總結(jié)那部分內(nèi)容内狗。
for (String[] job : jobList) {
cw.writeRecord(job);
}
}
cw.close();
}
直接new一個CsvWriter對象,然后調(diào)用writeRecord方法义锥,參數(shù)就是你要寫入的字符串數(shù)組(每一行就是一個數(shù)組柳沙,每個數(shù)組的長度可以不同,寫入時按從左到右依次將數(shù)組的每一個元素對應到當行的每一列拌倍。)赂鲤,是不是很簡單~SO EASY~
但是要分門別類的按照sheet寫入就比較麻煩了,網(wǎng)上找到一個比較完整的可以直接拿來用的類柱恤,稍微修改了下数初,可以保存為工具類:
首先當然還是先在pom里添加依賴的jar包poi:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
重點來了,工具類:
package com.src.factory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import java.io.OutputStream;
import java.util.List;
public class ExportExcelUtils {
/**
* @Title: exportExcel
* @Description: 導出Excel的方法
* @param workbook
* @param sheetNum (sheet的位置梗顺,0表示第一個表格中的第一個sheet)
* @param sheetTitle (sheet的名稱)
* @param headers (表格的標題)
* @param result (表格的數(shù)據(jù))
* @param out (輸出流)
* @throws Exception
*/
public void exportExcel(HSSFWorkbook workbook, int sheetNum,
String sheetTitle, String[] headers, List<List<String>> result,
OutputStream out) throws Exception {
// 生成一個表格
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(sheetNum, sheetTitle);
// 設(shè)置表格默認列寬度為20個字節(jié)
sheet.setDefaultColumnWidth(50);
// 生成一個樣式
HSSFCellStyle style = workbook.createCellStyle();
// 設(shè)置這些樣式
style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一個字體
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.BLACK.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字體應用到當前的樣式
style.setFont(font);
// 指定當單元格內(nèi)容顯示不下時自動換行
style.setWrapText(true);
// 產(chǎn)生表格標題行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text.toString());
}
// 遍歷集合數(shù)據(jù)泡孩,產(chǎn)生數(shù)據(jù)行
if (result != null) {
int index = 1;
for (List<String> m : result) {
row = sheet.createRow(index);
int cellIndex = 0;
for (String str : m) {
HSSFCell cell = row.createCell(cellIndex);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(str.toString());
cellIndex++;
}
index++;
}
}
}
}
用法舉例:
public static void writeXls(String[] fileList) {
try {
OutputStream out = new FileOutputStream("fileList.xls");
ExportExcelUtils eeu = new ExportExcelUtils();
HSSFWorkbook workbook = new HSSFWorkbook();
List<List<String>> data = new ArrayList<List<String>>();
int i=0;
for (String file : fileList) {
ArrayList<String[]> jobList = fileParsing(new File(FILE_FOLDER + "\\" + file));
data.clear();
for(String[] job: jobList){
data.add(Arrays.asList(job)); //java的這個方法很給力,可以直接把字符串數(shù)組轉(zhuǎn)換為list
}
eeu.exportExcel(workbook, i++, file, headers, data, out);
//原理就是將所有的數(shù)據(jù)一起寫入荚守,然后再關(guān)閉輸入流珍德。
}
workbook.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
有了上面的工具類,也挺簡單的矗漾,跟寫入csv不同的是,參數(shù)不再是字符串數(shù)組薄料,而是List<List<String>> 這種敞贡,我這里是偷了個懶,直接將上面那種字符串數(shù)組格式用Arrays的asList()方法轉(zhuǎn)成了字符串list的list摄职。如果方便誊役,可以從一開始就調(diào)整好格式,省得轉(zhuǎn)來轉(zhuǎn)去燒腦谷市,舉個給data塞數(shù)據(jù)的最簡單的例子:
List<List<String>> data = new ArrayList<List<String>>();
for (int i = 1; i < 5; i++) {
List rowData = new ArrayList();
rowData.add(String.valueOf(i));
rowData.add("java");
data.add(rowData);
}
這里一條rowData是要寫入的一行蛔垢,data是寫入一個sheet的格式。一般我們調(diào)用exportExcel把所有sheet的數(shù)據(jù)都準備好迫悠,最后調(diào)用一次write方法寫入鹏漆,然后關(guān)閉輸入流。所以雖然這個工具類很好用,數(shù)據(jù)的正確組織還是個難點艺玲,這里我踩了很多坑括蝠,合適的話可以參考我上面的代碼,但由于需求可能各不相同饭聚,數(shù)據(jù)源也不一定什么格式忌警,這里無法一一列舉,只能幫到這里秒梳,剩下的就靠你們自己了法绵。
再啰嗦一點感慨:所以一個好的程序員具備清晰的邏輯思維、腦筋清楚是很重要的酪碘,大家都只看到了程序員敲行代碼實現(xiàn)一個功能得簡單礼烈,不一定看到我們燈下冥思苦想一個解決方案時的困難,稍微不小心哪里沒有考慮周全婆跑,說不定就要為了找bug調(diào)功能徹夜加班此熬。一句話:生活不易,大家加油滑进!