最近想学习怎样读写Excel,找到了 POI,在学习 文档 的基础上一起开始我们的学习里程吧!

非常不好意思,光撩了一个标题在这儿,一直没写博客。

先来说说我为什么会想到这么一个奇怪的东西,因为公司做游戏的时候使用的配置文件都是由EXCEl表格生成的二进制文件,我就琢磨了一下是怎么实现的没在网上搜索了一下,确实有这方面的资料。看到资料稍微多点的是就是这个POI,官网的资料也不少,官网在这里,大家可以看看http://poi.apache.org/

1.先来看看官方是怎么写EXCEl文件的

public void wirte() {
	try {
		//创建一个输出流,用于把excel写出的文件
		FileOutputStream out = new FileOutputStream("c:\\workbook.xls");
		//创建一个excel
		Workbook wb = new HSSFWorkbook();
		//创建一个页面
		Sheet s = wb.createSheet();
		Row r = null;
		Cell c = null;
		CellStyle cs = wb.createCellStyle();
		CellStyle cs2 = wb.createCellStyle();
		CellStyle cs3 = wb.createCellStyle();
		DataFormat df = wb.createDataFormat();
		Font f = wb.createFont();
		Font f2 = wb.createFont();
		//设置字体高度
		f.setFontHeightInPoints((short) 12);
		f.setColor((short) 0xc);
		//粗体
		f.setBoldweight(Font.BOLDWEIGHT_BOLD);
		f2.setFontHeightInPoints((short) 10);
		//设置字体颜色
		f2.setColor((short) Font.COLOR_RED);
		f2.setBoldweight(Font.BOLDWEIGHT_BOLD);
		f2.setStrikeout(true);
		cs.setFont(f);
		cs.setDataFormat(df.getFormat("#,##0.0"));
		cs2.setBorderBottom(cs2.BORDER_THIN);
		cs2.setFillPattern((short) CellStyle.SOLID_FOREGROUND);
		cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
		cs2.setFont(f2);
		wb.setSheetName(
				0,
				"\u0422\u0435\u0441\u0442\u043E\u0432\u0430\u044F "
						+ "\u0421\u0442\u0440\u0430\u043D\u0438\u0447\u043A\u0430");
		int rownum;
		//for循环输出30行数据
		for (rownum = (short) 0; rownum < 30; rownum++) {
			r = s.createRow(rownum);
			if ((rownum % 2) == 0) {//设置偶数行单元格的高度
				r.setHeight((short) 0x249);
			}
			//10列数据
			for (short cellnum = (short) 0; cellnum < 10; cellnum += 2) {
				c = r.createCell(cellnum);
				//设置单元格的数值
				c.setCellValue(rownum
						* 10000
						+ cellnum
						+ (((double) rownum / 1000) + ((double) cellnum / 10000)));

				String cellValue;
				c = r.createCell((short) (cellnum + 1));
				//偶数行设置值为Test
				if ((rownum % 2) == 0) {
					c.setCellStyle(cs);
					c.setCellValue("Test");
				} else {
					c.setCellStyle(cs2);
					c.setCellValue("\u0422\u0435\u0441\u0442");
				}
				s.setColumnWidth((short) (cellnum + 1),
						(short) ((50 * 8) / ((double) 1 / 20)));
			}
		}
		rownum++;
		rownum++;

		r = s.createRow(rownum);
		cs3.setBorderBottom(cs3.BORDER_THICK);
		for (short cellnum = (short) 0; cellnum < 50; cellnum++)
		{
			c = r.createCell(cellnum);
			c.setCellStyle(cs3);
		}
		s = wb.createSheet();
		//设置第二页的页名
		wb.setSheetName(1, "DeletedSheet");
		wb.removeSheetAt(1);
		wb.write(out);
		out.close();
	} catch (IOException e) {

	}
}

运行结果是这样的:

2.下面看一下我读取excel文件的简单例子

public void readExcel() {
	POIFSFileSystem fs = null;
	HSSFWorkbook wb = null;
	HSSFSheet sheet = null;
	HSSFRow row = null;
	try {
		FileInputStream is = new FileInputStream("E:\\hero.xls");
		fs = new POIFSFileSystem(is);
		wb = new HSSFWorkbook(fs);
	} catch (IOException e) {
		e.printStackTrace();
	}
	sheet = wb.getSheetAt(0);

	for (int i = 2; i < 6; i++) {
		String resultString = "row = " + (i + 1);
		row = sheet.getRow(i);

		row.getCell(0).setCellType(HSSFCell.CELL_TYPE_STRING);
		row.getCell(1).setCellType(HSSFCell.CELL_TYPE_STRING);
		row.getCell(2).setCellType(HSSFCell.CELL_TYPE_STRING);
		row.getCell(3).setCellType(HSSFCell.CELL_TYPE_STRING);
		row.getCell(4).setCellType(HSSFCell.CELL_TYPE_STRING);
		row.getCell(5).setCellType(HSSFCell.CELL_TYPE_STRING);

		resultString += ",id = " + row.getCell(0).getStringCellValue();
		resultString += ",name = " + row.getCell(1).getStringCellValue();
		resultString += ",type = " + row.getCell(2).getStringCellValue();
		resultString += ",attack = " + row.getCell(3).getStringCellValue();
		resultString += ",speed = " + row.getCell(4).getStringCellValue();
		resultString += ",guard = " + row.getCell(5).getStringCellValue();
		System.out.println(resultString);
	}
}

我这里均已String类型读取数据,只显示数据内容,实际情况应该是根据数据判断读取的。

看一下数据文件hero.xls

看一下读取的结果: