* @author liuwu
* Excel的导入与导出
*/
@SuppressWarnings({ "unchecked" })
public class ExcelOperate {
/**
* @author liuwu
* 这是一个通用的方法,利用了JAVA的反射机制,
* 可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL的形式输出到指定IO设备上
* @param title 表格标题名
* @param headers 表格属性列名数组
* @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。
* 此方法支持的 javabean属性【数据类型有java基本数据类型及String,Date,byte[](图片转成字节码)】
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
* @throws IOException
*/
public static void exportExcel(String title, String[] headers,Collection<?> dataset, OutputStream out, String pattern) throws IOException {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook()
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title)
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 20)
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle()
// 设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_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.VIOLET.index)
font.setFontHeightInPoints((short) 12)
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD)
// 把字体应用到当前的样式
style.setFont(font)
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle()
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index)
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND)
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN)
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN)
style2.setBorderRight(HSSFCellStyle.BORDER_THIN)
style2.setBorderTop(HSSFCellStyle.BORDER_THIN)
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER)
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER)
// 生成另一个字体
HSSFFont font2 = workbook.createFont()
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL)
// 把字体应用到当前的样式
style2.setFont(font2)
// 产生表格标题行
HSSFRow row = sheet.createRow(0)
for (short i = 0 i < headers.length i++) {
HSSFCell cell = row.createCell(i)
cell.setCellStyle(style)
HSSFRichTextString text = new HSSFRichTextString(headers[i])
cell.setCellValue(text)
}
// 遍历集合数据,产生数据行
Iterator<?> it = dataset.iterator()
int index = 0
while (it.hasNext()) {
index++
row = sheet.createRow(index)
Object t = it.next()
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields()
for (short i = 0 i < fields.length i++) {
HSSFCell cell = row.createCell(i)
cell.setCellStyle(style2)
Field field = fields[i]
String fieldName = field.getName()
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1)//注意 实体get Set不要自己改名字不然反射会有问题
try {
Class tCls = t.getClass()
Method getMethod = tCls.getMethod(getMethodName,new Class[] {})
Object value = getMethod.invoke(t, new Object[] {})
HSSFRichTextString richString = new HSSFRichTextString(value.toString())
HSSFFont font3 = workbook.createFont()
font3.setColor(HSSFColor.BLUE.index)
richString.applyFont(font3)
cell.setCellValue(richString)
} catch (SecurityException e) {
e.printStackTrace()
e=null
} catch (NoSuchMethodException e) {
e.printStackTrace()
e=null
} catch (IllegalArgumentException e) {
e.printStackTrace()
e=null
} catch (IllegalAccessException e) {
e.printStackTrace()
e=null
} catch (InvocationTargetException e) {
e.printStackTrace()
e=null
} finally {
// 清理资源
}
}
}
try {
workbook.write(out)
} catch (IOException e) {
e.printStackTrace()
e=null
}
}
}
//java生成简单的Excel文件package beans.excel
import java.io.IOException
import java.io.OutputStream
import jxl.Workbook
import jxl.write.Label
import jxl.write.WritableSheet
import jxl.write.WritableWorkbook
import jxl.write.WriteException
public class SimpleExcelWrite {
public void createExcel(OutputStream os) throws WriteException,IOException{
//创建工作薄
WritableWorkbook workbook = Workbook.createWorkbook(os)
//创建新的一页
WritableSheet sheet = workbook.createSheet("First Sheet",0)
//创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
Label xuexiao = new Label(0,0,"学校")
sheet.addCell(xuexiao)
Label zhuanye = new Label(1,0,"专业")
sheet.addCell(zhuanye)
Label jingzhengli = new Label(2,0,"专业竞争力")
sheet.addCell(jingzhengli)
Label qinghua = new Label(0,1,"清华大学")
sheet.addCell(qinghua)
Label jisuanji = new Label(1,1,"计算机专业")
sheet.addCell(jisuanji)
Label gao = new Label(2,1,"高")
sheet.addCell(gao)
Label beida = new Label(0,2,"北京大学")
sheet.addCell(beida)
Label falv = new Label(1,2,"法律专业")
sheet.addCell(falv)
Label zhong = new Label(2,2,"中")
sheet.addCell(zhong)
Label ligong = new Label(0,3,"北京理工大学")
sheet.addCell(ligong)
Label hangkong = new Label(1,3,"航空专业")
sheet.addCell(hangkong)
Label di = new Label(2,3,"低")
sheet.addCell(di)
//把创建的内容写入到输出流中,并关闭输出流
workbook.write()
workbook.close()
os.close()
}
}
通过这个例子,演示以下如何用java生成excel文件:import org.apache.poi.hssf.usermodel.*
import java.io.FileOutputStream
import java.io.IOException
publicclass CreateCells
{
publicstaticvoid main(String[] args)
throws IOException
{
HSSFWorkbook wb = new HSSFWorkbook()//建立新HSSFWorkbook对象
HSSFSheet sheet = wb.createSheet("new sheet")//建立新的sheet对象
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0)//建立新行
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0)//建立新cell
cell.setCellValue(1)//设置cell的整数类型的值
// Or do it on one line.
row.createCell((short)1).setCellValue(1.2)//设置cell浮点类型的值
row.createCell((short)2).setCellValue("test")//设置cell字符类型的值
row.createCell((short)3).setCellValue(true)//设置cell布尔类型的值
HSSFCellStyle cellStyle = wb.createCellStyle()//建立新的cell样式
cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"))//设置cell样式为定制的日期格式
HSSFCell dCell =row.createCell((short)4)
dCell.setCellValue(new Date())//设置cell为日期类型的值
dCell.setCellStyle(cellStyle)//设置该cell日期的显示格式
HSSFCell csCell =row.createCell((short)5)
csCell.setEncoding(HSSFCell.ENCODING_UTF_16)//设置cell编码解决中文高位字节截断
csCell.setCellValue("中文测试_Chinese Words Test")//设置中西文结合字符串
row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR)//建立错误cell
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls")
wb.write(fileOut)
fileOut.close()
}
}