Java实现对execl的导入和导出

完成execl的倒入和导出可以用两种方式,一个是Poi,一个是jxl,这里我选择的是poi方式完成
主要实现的功能是个人正对某个应用专门设计的,具体可以根据代码注释进行查看,这里不再赘述。
 
 
/** 关于poi.jar对execl的简单解析
 * @author trsli
 * 该类目前只支持对简单ececl的解析,具体操作根据个人要求设计。
 * 我要做的主要是通过某应用程序导出或者倒入execl文件,
 * 该类有部分方法属于网络借鉴,再加上个人业务需要改编。
 * */
public class PoiUtil {
	public PoiUtil() {
		// TODO Auto-generated constructor stub
	}
	private HSSFWorkbook workbook;

	public PoiUtil(File execlFile) throws IOException, FileNotFoundException {
		workbook = new HSSFWorkbook(new FileInputStream(execlFile));
	}

	/** 获取表中所有数据 */
	public List<List> getDataSheet(int sheetNumber)
			throws FileNotFoundException {
		HSSFSheet sheet = workbook.getSheetAt(sheetNumber);
		List<List> result = new ArrayList<List>();
		// 获取数据总行数,编号是从0开始的
		int rowcount = sheet.getLastRowNum()+1;
		if (rowcount < 1) {
			return result;
		}
		// 逐行读取数据
		for (int i = 0; i < rowcount; i++) {
			// 获取行对象
			HSSFRow row = sheet.getRow(i);
			if (row != null) {
				List<Object> rowData = new ArrayList<Object>();
				// 获取本行中单元格个数
				int column = row.getLastCellNum();
				// 获取本行中各单元格的数据
				for (int cindex = 0; cindex < column; cindex++) {
					HSSFCell cell = row.getCell(cindex);
					// 获得指定单元格中的数据
					Object cellstr = getCellString(cell);
					rowData.add(cellstr);
				}
				result.add(rowData);
			}
		}
		return result;
	}

	/** 获取单元格中的内容 ,该犯法用于解析各种形式的数据*/
	private Object getCellString(HSSFCell cell) {
		Object result = null;
		if (cell != null) {
			int cellType = cell.getCellType();
			switch (cellType) {
			case HSSFCell.CELL_TYPE_STRING:
				result = cell.getRichStringCellValue().getString();
				break;
			case HSSFCell.CELL_TYPE_NUMERIC:
				result = cell.getNumericCellValue();
				break;
			case HSSFCell.CELL_TYPE_FORMULA:
				result = cell.getNumericCellValue();
				break;
			case HSSFCell.CELL_TYPE_ERROR:
				result = null;
				break;
			case HSSFCell.CELL_TYPE_BOOLEAN:
				result = cell.getBooleanCellValue();
				break;
			case HSSFCell.CELL_TYPE_BLANK:
				result = null;
				break;
			default:
				break;
			}
		}
		return result;
	}

	/** 导出函数有三个参数,主内容数据,标题数组,到处文件名 */
	public void createxls(Object[][] messages,String[] titles, String filename) {
		try {
			FileOutputStream fos = new FileOutputStream(new File(filename));
			HSSFWorkbook book = new HSSFWorkbook();// 所有execl的父节点
			HSSFSheet sheet = book.createSheet("sheet1");//此处可以随意设置
			HSSFRow hssfrow = sheet.createRow(0);//创建首行标题
			HSSFCell hssfcell=null;
			for(int i=0;i<titles.length;i++){//创建标题栏目,也就是表格第一行
				hssfcell = hssfrow.createCell(i);
				hssfcell.setCellType(HSSFCell.ENCODING_UTF_16);
				hssfcell.setCellValue(titles[i]);
			}
			
			System.out.println("message:"+messages.length);
			for(int i=0;i<messages.length;i++){//添加表格中的内容
				hssfrow = sheet.createRow(i+1);//创建表格第二行,由于标记为0,这里设置为一,主要为了区别标题和内容
				Object[] obj=messages[i];
				for(int j=0;j<obj.length;j++){
					hssfcell = hssfrow.createCell(j);
					hssfcell.setCellType(HSSFCell.ENCODING_UTF_16);//关于数据编码的问题
					hssfcell.setCellValue(obj[j]+"");//转换为字符串的方式
					System.out.print(obj[j]+"\t");
				}
				System.out.println();
			}
			book.write(fos);
			fos.flush();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e);
		}
	}
	/**获取内容标题的方法*/
	public String[] gettitles(String fname){
		try {
			PoiUtil poi=new PoiUtil(new File(fname));
			List<List> datas = poi.getDataSheet(0);
			String[] title=new String[datas.get(0).size()];//由于存储标题数据
			for(int i=0;i<title.length;i++){
				title[i]=datas.get(0).get(i).toString();//第一行
			}
			return title;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	/**获取数据内容的方法*/
	public  Object[][] getmessage(String fname){
		try {
			PoiUtil poi=new PoiUtil(new File(fname));
			List<List> datas = poi.getDataSheet(0);
			Object[][] p=new Object[datas.size()-1][datas.get(0).size()];//二维数组大小,即用户存储表格内容数据
			for (int i = 1; i < datas.size(); i++) {
				List row = datas.get(i);
				for (int j = 0; j < row.size(); j++) {
					Object value = row.get(j);
					p[i-1][j] = String.valueOf(value);
				}
			}
			return p;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println(e);
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	public static void main(String[] args) {
			PoiUtil poi = new PoiUtil();
			Object[][] p=poi.getmessage("E:\\Book1.xls");//倒入数据方法
			String[] title=poi.gettitles("E:\\Book1.xls");
			System.out.println(title.length+":"+title[0]+title[1]);
			System.out.println(p.length+""+p[0][0]);//这是正确的
			poi.createxls(p, title,"E:\\testli.xls");//new String[]{"序号","姓名","成绩"}

	}


测试结果:

生成文件截屏:

整个功能简单,对于更深层次的使用java对execl进行操作,目前正在研究。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值