JAVA将一个字符串数组直接写入csv文件比较容易,直接用jar包javacsv里的CsvWriter类就可以了,具体用法如下:
1.首先在pom中引入jar包(为了方便管理,我用的maven,当然你也可以直接在lib中加入此包,maven的具体用法我稍后整理完发布。)
<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[]{"姓名","语文","数学"};
cw.writeRecord(headers);//写入最上面的一行标题
for (String file : fileList) {
cw.writeRecord(new String[]{file});
ArrayList<String[]> jobList = fileParsing(new File(JOB_FOLDER + "\\" + file));
//此处fileParsing是一个将JOB_FOLDER这个文件里所有文件的内容读取到一个list的方法,有空再总结那部分内容。
for (String[] job : jobList) {
cw.writeRecord(job);
}
}
cw.close();
}
直接new一个CsvWriter对象,然后调用writeRecord方法,参数就是你要写入的字符串数组(每一行就是一个数组,每个数组的长度可以不同,写入时按从左到右依次将数组的每一个元素对应到当行的每一列。),是不是很简单~SO EASY~
但是要分门别类的按照sheet写入就比较麻烦了,网上找到一个比较完整的可以直接拿来用的类,稍微修改了下,可以保存为工具类:
首先当然还是先在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 (表格的数据)
* @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);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth(50);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
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);
// 指定当单元格内容显示不下时自动换行
style.setWrapText(true);
// 产生表格标题行
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());
}
// 遍历集合数据,产生数据行
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的这个方法很给力,可以直接把字符串数组转换为list
}
eeu.exportExcel(workbook, i++, file, headers, data, out);
//原理就是将所有的数据一起写入,然后再关闭输入流。
}
workbook.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
有了上面的工具类,也挺简单的,跟写入csv不同的是,参数不再是字符串数组,而是List<List<String>> 这种,我这里是偷了个懒,直接将上面那种字符串数组格式用Arrays的asList()方法转成了字符串list的list。如果方便,可以从一开始就调整好格式,省得转来转去烧脑,举个给data塞数据的最简单的例子:
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的格式。一般我们调用exportExcel把所有sheet的数据都准备好,最后调用一次write方法写入,然后关闭输入流。所以虽然这个工具类很好用,数据的正确组织还是个难点,这里我踩了很多坑,合适的话可以参考我上面的代码,但由于需求可能各不相同,数据源也不一定什么格式,这里无法一一列举,只能帮到这里,剩下的就靠你们自己了。
再啰嗦一点感慨:所以一个好的程序员具备清晰的逻辑思维、脑筋清楚是很重要的,大家都只看到了程序员敲行代码实现一个功能得简单,不一定看到我们灯下冥思苦想一个解决方案时的困难,稍微不小心哪里没有考虑周全,说不定就要为了找bug调功能彻夜加班。一句话:生活不易,大家加油!