将多个CSV文件导出为一个Excel文件 使用POI技术 (序号未完美实现)

首先思路要整理清楚。

1.通过缓冲字节流获取到文件夹下所有文件  命名 CsvUtil  将要获取的内容封装为List并返回,

package com.ityinhe.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;


public class CsvUtil {
		@SuppressWarnings({ "resource", "unchecked", "rawtypes" })
		public static List<String> getCsvData() throws Exception{
			//
			File file = new File("D:\\001");
			//获取所有文件
			File[] list = file.listFiles();
			ArrayList<String> lists = new ArrayList();
			//如果list为空 返回
			//if(list == null) return ;
			for(File f :list){
				System.out.println(f);
				if(!f.isDirectory()){//检查对象是否是一个文件夹  
					//Test1(f.getAbsolutePath());
					//获取文件中的行数
					LineNumberReader lnr = new LineNumberReader(new FileReader(f));
					lnr.skip(Long.MAX_VALUE);
					int linNo = lnr.getLineNumber()-1;
					System.out.println(linNo);
					
					//System.out.println(f);
					System.out.println( "文件名:" + f.getAbsoluteFile() );
					//
					BufferedReader reader = new BufferedReader(new FileReader(f.getAbsoluteFile()));
					//
					reader.readLine();//第一行信息为标题信息,如果需要纯数据就注释掉
					//
					String line = null;
					
					while((line=reader.readLine())!=null){
						//System.out.println(reader.readLine().length());
						//CSV格式文件为逗号分隔符文件,这里根据逗号切分
						String[] item = line.split(",");
						//System.out.println(item[item.length]);
						//这就是你要的数据了
						String userName = item[item.length-42]; //姓名
						String cardNo = item[item.length-31];//身份证号
						String className = item[item.length-30];//班级
						System.out.println(userName+"\t"+cardNo+"\t"+className);
						
						//将读取的数据数组加入集合
						//
						lists.add(line);
					}
				}else{
					//
					// System.out.println( "File:" + f.getAbsoluteFile() );	
				}//if结尾
			}//for结尾
			return lists;
		}
		
		public static int getFileLinNum(File f) throws Exception{
			//获取文件中的行数
			LineNumberReader lnr = new LineNumberReader(new FileReader(f));
			lnr.skip(Long.MAX_VALUE);
			int linNo = lnr.getLineNumber()-1;
			System.out.println(linNo);
			return linNo;
		}
}

2.使用POI将数据到出    设置了一些POI样式

package com.ityinhe.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;


public class ExcleUtil {
		
		@SuppressWarnings({ "resource" })
		public static void saveXlsxData() throws Exception{	
			//创建
			Properties p=new Properties();
			//获取外置配置文件
			InputStream is=ClassLoader.getSystemResourceAsStream("db.properties");
			//从输入流中读取属性列表
			p.load(is);
			//迭代 key:stringPropertyNames
			Iterator<String> it= p.stringPropertyNames().iterator();
			//定义一个变量用于接收key 的 value 值
			String key = null;
			//循环出来数据
			while(it.hasNext()){
				key=it.next();
				System.out.println(key+"  "+p.getProperty(key));
			}
			//获取CsvUtil返回值
			List<String> lists= CsvUtil.getCsvData();
			/*for (String string : lists) {
				System.out.println(string);
			}*/
			//在内存中创建一个excel文件
			HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
			//创建一个样式对象
			HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
			HSSFFont hssfFont = hssfWorkbook.createFont();//生成一个字体    设置HSSFRowCell的字体样式
			hssfFont.setColor(HSSFColor.BLACK.index);	//字体颜色
			hssfFont.setFontName("宋体");//设置样式字体
			hssfFont.setFontHeightInPoints((short)12);// 字体大小
			hssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//字体正常 不加粗
			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
			cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
			cellStyle.setFont(hssfFont);//把字体加入样式
			
			//生成一个字体    设置HSSFCell的字体样式
			HSSFCellStyle cellStyle1 = hssfWorkbook.createCellStyle();
			HSSFFont hssfFont1 = hssfWorkbook.createFont();
			hssfFont1.setColor(HSSFColor.BLACK.index);	//字体颜色
			hssfFont1.setFontName("宋体");//设置样式字体
			hssfFont1.setFontHeightInPoints((short)22);// 字体大小
			hssfFont1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体正常 不加粗
			cellStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
			cellStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
			cellStyle1.setFont(hssfFont1);//把字体加入样式
			
			//设置单元格边框属性
			cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); //设置上边框
			cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); //设置右边框
			cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); //设置左边框
			cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//设置下边框
			cellStyle.setTopBorderColor(HSSFColor.BLACK.index);  //设置上边框颜色
			cellStyle.setRightBorderColor(HSSFColor.BLACK.index);//设置右边框颜色
			cellStyle.setTopBorderColor(HSSFColor.BLACK.index); //设置上边框颜色
			cellStyle.setRightBorderColor(HSSFColor.BLACK.index);//设置右边框颜色
			//创建一个标签页
			HSSFSheet sheet = hssfWorkbook.createSheet("sheet1");
			//设置单元格范围地址 
			CellRangeAddress cra = new CellRangeAddress(0,0,0, 5);	
			sheet.addMergedRegion(cra);//合并单元格
			//创建标题行(大标题) 
			HSSFRow hssfRow1 =sheet.createRow(0);
			HSSFCell rowCell=hssfRow1.createCell(0); //创建一行单元格
			hssfRow1.setHeightInPoints(40); //设置单元格高度
			rowCell.setCellStyle(cellStyle1); //给单元格的内容加入样式
			rowCell.setCellValue(new SimpleDateFormat("yyyyMMdd").format(new Date())+p.getProperty(key));//第一行单元格内容	
			//创建标题行(小标题头)
			HSSFRow hssfRow= sheet.createRow(1);
			//第一列单元格
			HSSFCell rowCell0 = hssfRow.createCell(0);
			rowCell0.setCellStyle(cellStyle);
			rowCell0.setCellValue("序号");
			//第一列单元格
			HSSFCell rowCell1 = hssfRow.createCell(1);
			rowCell1.setCellStyle(cellStyle);
			rowCell1.setCellValue("标记");
			//第二列单元格
			HSSFCell rowCell2 = hssfRow.createCell(2);
			rowCell2.setCellStyle(cellStyle);
			rowCell2.setCellValue("姓名");
			//第三列单元格
			HSSFCell rowCell3 = hssfRow.createCell(3);
			rowCell3.setCellStyle(cellStyle);
			rowCell3.setCellValue("身份证号");
			//第四列单元格
			HSSFCell rowCell4 = hssfRow.createCell(4);
			rowCell4.setCellStyle(cellStyle);
			rowCell4.setCellValue("班级");
			//第五列单元格
			HSSFCell rowCell5 = hssfRow.createCell(5);
			rowCell5.setCellStyle(cellStyle);
			rowCell5.setCellValue("备注");
			
			//创建 POI-行
			//遍历 -加入数据
			File file = new File("D:\\001");
			//获取所有文件
			File[] list = file.listFiles();
			//如果list为空 返回
			//if(list == null) return ;
			LineNumberReader lnr = null;
			int linNo=1;
			int tmp = 1;
			for (File f : list) {
				
				lnr = new LineNumberReader(new FileReader(f));
				lnr.skip(Long.MAX_VALUE);
				linNo = lnr.getLineNumber()-1;
				System.out.println(linNo);
				
			}
			/*for (int i = 1; i <= linNo; i++) {
				tmp=i;
			}*/
			//Test1(f.getAbsolutePath());
			for (String str : lists) {		
				
				String[] s = str.split(",");
				//System.out.println(s.equals(s));			
				tmp=tmp%linNo-2;
				tmp++;
				int i;
				for (i = 1; i < tmp%linNo-1; i++) {
					System.out.println(i);
				}
				//System.out.println(tmp);
				HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
				//创建行
				HSSFCell cell1 = dataRow.createCell(0);
				HSSFCell cell2 = dataRow.createCell(1);
				HSSFCell cell3 = dataRow.createCell(2);
				HSSFCell cell4 = dataRow.createCell(3);
				HSSFCell cell5 = dataRow.createCell(4);
				HSSFCell cell6 = dataRow.createCell(5);
				//给行加入颜色
				cell1.setCellStyle(cellStyle);
				cell2.setCellStyle(cellStyle);
				cell3.setCellStyle(cellStyle);
				cell4.setCellStyle(cellStyle);
				cell5.setCellStyle(cellStyle);
				cell6.setCellStyle(cellStyle);
				
				cell1.setCellValue(tmp-1);
				cell2.setCellValue(" ");
				cell3.setCellValue(s[s.length-42]);
				cell4.setCellValue(s[s.length-31]);
				cell5.setCellValue(s[s.length-30]);
				cell6.setCellValue(" ");
				//设置身份证号一列的宽度
				sheet.setColumnWidth(3, "身份证号".getBytes().length*3*256);
				sheet.setColumnWidth(5, "备注".getBytes().length*3*256);
			}
			//导出文件的文件名 -临时加入了秒的时间戳
			String filename="D:\\Excel\\"+p.getProperty(key)+"_采集名单"+new SimpleDateFormat("yyyyMMdd").format(new Date())+".xlsx";
			//创建一个文件 传入filename
			File files = new File(filename);
			//判断文件是否存在
			if(files.exists()){
				//如果存在就删除
				files.delete();
				files.createNewFile();
				//将文件放入 字节输出流输出
				FileOutputStream stream = new FileOutputStream(files);
				//POI - 导出EXCLE文件
				hssfWorkbook.write(stream);
				//关闭流
				stream.close();
			}else if(!files.exists()){
				files.createNewFile();
				//将文件放入 字节输出流输出
				FileOutputStream stream = new FileOutputStream(files);
				//POI - 导出XLSX文件
				hssfWorkbook.write(stream);
				//关闭流
				stream.close();
			}
		}
}

3.名称是写在一个properties里的,由于没有使用任何框架,使用Java中的方式获取了,在ExcelUtil类里获取的

studyName=\u6211\u662F\u6D4B\u8BD5

4.写一个主方法进行编辑

package com.bornsoft.test;

import com.bornsoft.utils.ExcleUtil;

public class Test {
	public static void main(String[] args) throws Exception{
		ExcleUtil.saveXlsxData();
	}
}

纯JAVA操作,只使用了POI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
导出多个Excel文件,可以使用POI的Workbook类来实现。具体可以按照以下步骤进行: 1. 创建一个Workbook对象。 2. 在Workbook对象中创建一个Sheet对象。 3. 在Sheet对象中创建行和单元格对象,并设置单元格中的数据。 4. 将Workbook对象写入到输出流中,保存为Excel文件。 下面是一个示例代码,它将生成两个Excel文件,每个文件包含一个名为“Sheet1”的工作表,其中有两行数据: ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportExcel { public static void main(String[] args) throws IOException { // 创建第一个Excel文件 Workbook wb1 = new XSSFWorkbook(); Sheet sheet1 = wb1.createSheet("Sheet1"); Row row1 = sheet1.createRow(0); row1.createCell(0).setCellValue("Hello"); row1.createCell(1).setCellValue("World"); Row row2 = sheet1.createRow(1); row2.createCell(0).setCellValue("Java"); row2.createCell(1).setCellValue("POI"); // 将第一个Excel文件写入输出流中 try (FileOutputStream fos1 = new FileOutputStream("excel1.xlsx")) { wb1.write(fos1); } // 创建第二个Excel文件 Workbook wb2 = new XSSFWorkbook(); Sheet sheet2 = wb2.createSheet("Sheet1"); Row row3 = sheet2.createRow(0); row3.createCell(0).setCellValue("Chit"); row3.createCell(1).setCellValue("GPT"); Row row4 = sheet2.createRow(1); row4.createCell(0).setCellValue("Java"); row4.createCell(1).setCellValue("POI"); // 将第二个Excel文件写入输出流中 try (FileOutputStream fos2 = new FileOutputStream("excel2.xlsx")) { wb2.write(fos2); } } } ``` 在上面的代码中,我们首先创建了一个名为“excel1.xlsx”的Excel文件,然后创建了一个名为“Sheet1”的工作表,并在其中添加了两行数据。然后我们将Workbook对象写入到输出流中,保存为Excel文件。接着我们创建了另一个Excel文件,并重复上述过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值