在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^)
呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。
将3个jar包导入到classpath下,什么?忘了怎么导包?不会吧!好,我们来写一个导出Excel的实用类(所谓实用,是指基本不用怎么修改就可以在实际项目中直接使用的!)。我一直强调做类也好,做方法也好,一定要通用性和灵活性强。下面这个类就算基本贯彻了我的这种思想。那么,熟悉许老师风格的人应该知道,这时候该要甩出一长串代码了。没错,大伙请看:
- import java.util.Date;
- public class Student
- {
- private long id;
- private String name;
- private int age;
- private boolean sex;
- private Date birthday;
- public Student()
- {
- }
- public Student(long id, String name, int age, boolean sex, Date birthday)
- {
- this.id = id;
- this.name = name;
- this.age = age;
- this.sex = sex;
- this.birthday = birthday;
- }
- public long getId()
- {
- return id;
- }
- public void setId(long id)
- {
- this.id = id;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public int getAge()
- {
- return age;
- }
- public void setAge(int age)
- {
- this.age = age;
- }
- public boolean getSex()
- {
- return sex;
- }
- public void setSex(boolean sex)
- {
- this.sex = sex;
- }
- public Date getBirthday()
- {
- return birthday;
- }
- public void setBirthday(Date birthday)
- {
- this.birthday = birthday;
- }
- }
import java.util.Date;
public class Student
{
private long id;
private String name;
private int age;
private boolean sex;
private Date birthday;
public Student()
{
}
public Student(long id, String name, int age, boolean sex, Date birthday)
{
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.birthday = birthday;
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public boolean getSex()
{
return sex;
}
public void setSex(boolean sex)
{
this.sex = sex;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
}
- public class Book
- {
- private int bookId;
- private String name;
- private String author;
- private float price;
- private String isbn;
- private String pubName;
- private byte[] preface;
- public Book()
- {
- }
- public Book(int bookId, String name, String author, float price,
- String isbn, String pubName, byte[] preface)
- {
- this.bookId = bookId;
- this.name = name;
- this.author = author;
- this.price = price;
- this.isbn = isbn;
- this.pubName = pubName;
- this.preface = preface;
- }
- public int getBookId()
- {
- return bookId;
- }
- public void setBookId(int bookId)
- {
- this.bookId = bookId;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getAuthor()
- {
- return author;
- }
- public void setAuthor(String author)
- {
- this.author = author;
- }
- public float getPrice()
- {
- return price;
- }
- public void setPrice(float price)
- {
- this.price = price;
- }
- public String getIsbn()
- {
- return isbn;
- }
- public void setIsbn(String isbn)
- {
- this.isbn = isbn;
- }
- public String getPubName()
- {
- return pubName;
- }
- public void setPubName(String pubName)
- {
- this.pubName = pubName;
- }
- public byte[] getPreface()
- {
- return preface;
- }
- public void setPreface(byte[] preface)
- {
- this.preface = preface;
- }
- }
public class Book
{
private int bookId;
private String name;
private String author;
private float price;
private String isbn;
private String pubName;
private byte[] preface;
public Book()
{
}
public Book(int bookId, String name, String author, float price,
String isbn, String pubName, byte[] preface)
{
this.bookId = bookId;
this.name = name;
this.author = author;
this.price = price;
this.isbn = isbn;
this.pubName = pubName;
this.preface = preface;
}
public int getBookId()
{
return bookId;
}
public void setBookId(int bookId)
{
this.bookId = bookId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public float getPrice()
{
return price;
}
public void setPrice(float price)
{
this.price = price;
}
public String getIsbn()
{
return isbn;
}
public void setIsbn(String isbn)
{
this.isbn = isbn;
}
public String getPubName()
{
return pubName;
}
public void setPubName(String pubName)
{
this.pubName = pubName;
}
public byte[] getPreface()
{
return preface;
}
public void setPreface(byte[] preface)
{
this.preface = preface;
}
}
上面这两个类一目了然,就是两个简单的javabean风格的类。再看下面真正的重点类:
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import javax.swing.JOptionPane;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFCellStyle;
- import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
- import org.apache.poi.hssf.usermodel.HSSFComment;
- import org.apache.poi.hssf.usermodel.HSSFFont;
- import org.apache.poi.hssf.usermodel.HSSFPatriarch;
- 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;
- /**
- * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
- *
- * @author leno
- * @version v1.0
- * @param <T>
- * 应用泛型,代表任意一个符合javabean风格的类
- * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
- * byte[]表jpg格式的图片数据
- */
- public class ExportExcel<T>
- {
- public void exportExcel(Collection<T> dataset, OutputStream out)
- {
- exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
- }
- public void exportExcel(String[] headers, Collection<T> dataset,
- OutputStream out)
- {
- exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
- }
- public void exportExcel(String[] headers, Collection<T> dataset,
- OutputStream out, String pattern)
- {
- exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
- }
- /**
- * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
- *
- * @param title
- * 表格标题名
- * @param headers
- * 表格属性列名数组
- * @param dataset
- * 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
- * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
- * @param out
- * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
- * @param pattern
- * 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
- */
- @SuppressWarnings("unchecked")
- public void exportExcel(String title, String[] headers,
- Collection<T> dataset, OutputStream out, String pattern)
- {
- // 声明一个工作薄
- HSSFWorkbook workbook = new HSSFWorkbook();
- // 生成一个表格
- HSSFSheet sheet = workbook.createSheet(title);
- // 设置表格默认列宽度为15个字节
- sheet.setDefaultColumnWidth((short) 15);
- // 生成一个样式
- 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);
- // 声明一个画图的顶级管理器
- HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
- // 定义注释的大小和位置,详见文档
- HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
- 0, 0, 0, (short) 4, 2, (short) 6, 5));
- // 设置注释内容
- comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
- // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
- comment.setAuthor("leno");
- // 产生表格标题行
- 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<T> it = dataset.iterator();
- int index = 0;
- while (it.hasNext())
- {
- index++;
- row = sheet.createRow(index);
- T t = (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);
- try
- {
- Class tCls = t.getClass();
- Method getMethod = tCls.getMethod(getMethodName,
- new Class[]
- {});
- Object value = getMethod.invoke(t, new Object[]
- {});
- // 判断值的类型后进行强制类型转换
- String textValue = null;
- // if (value instanceof Integer) {
- // int intValue = (Integer) value;
- // cell.setCellValue(intValue);
- // } else if (value instanceof Float) {
- // float fValue = (Float) value;
- // textValue = new HSSFRichTextString(
- // String.valueOf(fValue));
- // cell.setCellValue(textValue);
- // } else if (value instanceof Double) {
- // double dValue = (Double) value;
- // textValue = new HSSFRichTextString(
- // String.valueOf(dValue));
- // cell.setCellValue(textValue);
- // } else if (value instanceof Long) {
- // long longValue = (Long) value;
- // cell.setCellValue(longValue);
- // }
- if (value instanceof Boolean)
- {
- boolean bValue = (Boolean) value;
- textValue = "男";
- if (!bValue)
- {
- textValue = "女";
- }
- }
- else if (value instanceof Date)
- {
- Date date = (Date) value;
- SimpleDateFormat sdf = new SimpleDateFormat(pattern);
- textValue = sdf.format(date);
- }
- else if (value instanceof byte[])
- {
- // 有图片时,设置行高为60px;
- row.setHeightInPoints(60);
- // 设置图片所在列宽度为80px,注意这里单位的一个换算
- sheet.setColumnWidth(i, (short) (35.7 * 80));
- // sheet.autoSizeColumn(i);
- byte[] bsValue = (byte[]) value;
- HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
- 1023, 255, (short) 6, index, (short) 6, index);
- anchor.setAnchorType(2);
- patriarch.createPicture(anchor, workbook.addPicture(
- bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
- }
- else
- {
- // 其它数据类型都当作字符串简单处理
- textValue = value.toString();
- }
- // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
- if (textValue != null)
- {
- Pattern p = Pattern.compile("^//d+(//.//d+)?$");
- Matcher matcher = p.matcher(textValue);
- if (matcher.matches())
- {
- // 是数字当作double处理
- cell.setCellValue(Double.parseDouble(textValue));
- }
- else
- {
- HSSFRichTextString richString = new HSSFRichTextString(
- textValue);
- HSSFFont font3 = workbook.createFont();
- font3.setColor(HSSFColor.BLUE.index);
- richString.applyFont(font3);
- cell.setCellValue(richString);
- }
- }
- }
- catch (SecurityException e)
- {
- e.printStackTrace();
- }
- catch (NoSuchMethodException e)
- {
- e.printStackTrace();
- }
- catch (IllegalArgumentException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (InvocationTargetException e)
- {
- e.printStackTrace();
- }
- finally
- {
- // 清理资源
- }
- }
- }
- try
- {
- workbook.write(out);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- public static void main(String[] args)
- {
- // 测试学生
- ExportExcel<Student> ex = new ExportExcel<Student>();
- String[] headers =
- { "学号", "姓名", "年龄", "性别", "出生日期" };
- List<Student> dataset = new ArrayList<Student>();
- dataset.add(new Student(10000001, "张三", 20, true, new Date()));
- dataset.add(new Student(20000002, "李四", 24, false, new Date()));
- dataset.add(new Student(30000003, "王五", 22, true, new Date()));
- // 测试图书
- ExportExcel<Book> ex2 = new ExportExcel<Book>();
- String[] headers2 =
- { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" };
- List<Book> dataset2 = new ArrayList<Book>();
- try
- {
- BufferedInputStream bis = new BufferedInputStream(
- new FileInputStream("V://book.bmp"));
- byte[] buf = new byte[bis.available()];
- while ((bis.read(buf)) != -1)
- {
- //
- }
- dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",
- "清华出版社", buf));
- dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",
- "阳光出版社", buf));
- dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",
- "清华出版社", buf));
- dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",
- "清华出版社", buf));
- dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",
- "汤春秀出版社", buf));
- OutputStream out = new FileOutputStream("E://a.xls");
- OutputStream out2 = new FileOutputStream("E://b.xls");
- ex.exportExcel(headers, dataset, out);
- ex2.exportExcel(headers2, dataset2, out2);
- out.close();
- out2.close();
- JOptionPane.showMessageDialog(null, "导出成功!");
- System.out.println("excel导出成功!");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
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;
/**
* 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
*
* @author leno
* @version v1.0
* @param <T>
* 应用泛型,代表任意一个符合javabean风格的类
* 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
* byte[]表jpg格式的图片数据
*/
public class ExportExcel<T>
{
public void exportExcel(Collection<T> dataset, OutputStream out)
{
exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out)
{
exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out, String pattern)
{
exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
}
/**
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
*
* @param title
* 表格标题名
* @param headers
* 表格属性列名数组
* @param dataset
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
* javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
@SuppressWarnings("unchecked")
public void exportExcel(String title, String[] headers,
Collection<T> dataset, OutputStream out, String pattern)
{
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);
// 生成一个样式
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);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("leno");
// 产生表格标题行
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<T> it = dataset.iterator();
int index = 0;
while (it.hasNext())
{
index++;
row = sheet.createRow(index);
T t = (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);
try
{
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[]
{});
Object value = getMethod.invoke(t, new Object[]
{});
// 判断值的类型后进行强制类型转换
String textValue = null;
// if (value instanceof Integer) {
// int intValue = (Integer) value;
// cell.setCellValue(intValue);
// } else if (value instanceof Float) {
// float fValue = (Float) value;
// textValue = new HSSFRichTextString(
// String.valueOf(fValue));
// cell.setCellValue(textValue);
// } else if (value instanceof Double) {
// double dValue = (Double) value;
// textValue = new HSSFRichTextString(
// String.valueOf(dValue));
// cell.setCellValue(textValue);
// } else if (value instanceof Long) {
// long longValue = (Long) value;
// cell.setCellValue(longValue);
// }
if (value instanceof Boolean)
{
boolean bValue = (Boolean) value;
textValue = "男";
if (!bValue)
{
textValue = "女";
}
}
else if (value instanceof Date)
{
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
}
else if (value instanceof byte[])
{
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) value;
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
1023, 255, (short) 6, index, (short) 6, index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
}
else
{
// 其它数据类型都当作字符串简单处理
textValue = value.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null)
{
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches())
{
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
}
else
{
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
finally
{
// 清理资源
}
}
}
try
{
workbook.write(out);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
// 测试学生
ExportExcel<Student> ex = new ExportExcel<Student>();
String[] headers =
{ "学号", "姓名", "年龄", "性别", "出生日期" };
List<Student> dataset = new ArrayList<Student>();
dataset.add(new Student(10000001, "张三", 20, true, new Date()));
dataset.add(new Student(20000002, "李四", 24, false, new Date()));
dataset.add(new Student(30000003, "王五", 22, true, new Date()));
// 测试图书
ExportExcel<Book> ex2 = new ExportExcel<Book>();
String[] headers2 =
{ "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" };
List<Book> dataset2 = new ArrayList<Book>();
try
{
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("V://book.bmp"));
byte[] buf = new byte[bis.available()];
while ((bis.read(buf)) != -1)
{
//
}
dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",
"清华出版社", buf));
dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",
"阳光出版社", buf));
dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",
"清华出版社", buf));
dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",
"清华出版社", buf));
dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",
"汤春秀出版社", buf));
OutputStream out = new FileOutputStream("E://a.xls");
OutputStream out2 = new FileOutputStream("E://b.xls");
ex.exportExcel(headers, dataset, out);
ex2.exportExcel(headers2, dataset2, out2);
out.close();
out2.close();
JOptionPane.showMessageDialog(null, "导出成功!");
System.out.println("excel导出成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
写完之后,如果您不是用eclipse工具生成的Servlet,千万别忘了在web.xml上注册这个Servelt。而且同样的,
拷贝一张小巧的图书图片命名为book.jpg放置到当前WEB根目录的/WEB-INF/下。部署好web工程,用浏览器访问Servlet看下效果吧!是不是下载成功了。呵呵,您可以将下载到本地的excel报表用打印机打印出来,这样您就大功告成了。完事了我们就思考:我们发现,我们做的方法,不管是本地调用,还是在WEB服务器端用Servlet调用;不管是输出学生列表,还是图书列表信息,代码都几乎一样,而且这些数据我们很容器结合后台的DAO操作数据库动态获取。恩,类和方法的通用性和灵活性开始有点感觉了。好啦,祝您学习愉快!
Java导出Excel弹出下载框
将ExportExcel类的main方法改成public void test(),OutputStream out = new FileOutputStream("E://a.xls");这边可以对应Servlet适当改下路径,Servlet代码如下:
- public class ExcelServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- (new ExportExcel()).test();
- String str = "a.xls";
- //String path = request.getSession().getServletContext().getRealPath(str);
- download("E://a.xls", response);
- }
- private void download(String path, HttpServletResponse response) {
- try {
- // path是指欲下载的文件的路径。
- File file = new File(path);
- // 取得文件名。
- String filename = file.getName();
- // 以流的形式下载文件。
- InputStream fis = new BufferedInputStream(new FileInputStream(path));
- byte[] buffer = new byte[fis.available()];
- fis.read(buffer);
- fis.close();
- // 清空response
- response.reset();
- // 设置response的Header
- response.addHeader("Content-Disposition", "attachment;filename="
- + new String(filename.getBytes()));
- response.addHeader("Content-Length", "" + file.length());
- OutputStream toClient = new BufferedOutputStream(
- response.getOutputStream());
- response.setContentType("application/vnd.ms-excel;charset=gb2312");
- toClient.write(buffer);
- toClient.flush();
- toClient.close();
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- }
public class ExcelServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
(new ExportExcel()).test();
String str = "a.xls";
//String path = request.getSession().getServletContext().getRealPath(str);
download("E://a.xls", response);
}
private void download(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
补充:
于2014-08-28补充
今天(20140828)用博文中的代码重新调试了下,献上Java POI 导入导出Excel简单小例子一枚,方便你我。
源代码下载地址:http://download.csdn.net/detail/evangel_z/7834173
注:
1)源代码是不含jar包的,jar包可以去本文补充部分下边的链接中下载,本地测试例子中所使用的所有jar包如下:
2)直接使用该例子源代码的话,需要在E盘下放置一张名为book的png格式图片(book.png),用于导出含有图片的excel文件(b.xls)。当然,您可以根据实际需要更换代码中的图片路径;
3)使用本文源代码正常启动服务器后,web页面导出Excel文档具体路径:http://localhost:8080/poi/export
4)例子代码比较简单,仅供参考……
于2014-12-02补充
前段时间,在之前代码的基础上,抽空改了改代码,具体如下:
1)去除图片和Excel文件未找到的bug;
2)增加代码需要的jar包;
3)完整代码已放在github上……
最新代码下载地址:https://github.com/T5750/poi
于2015-01-13补充
由于不少热心网友问读取Excel模版导出相关问题,故今晚在之前代码的基础上,临时加了些代码,具体如下:
1)新增使用POI读取Excel模版的例子,模版为poi/WebContent/docs/replaceTemplate.xls;
2)在poi/src/replace/TestExcelReplace类中,请根据实际情况,调整读取和保存Excel的路径后,直接运行即可;
最新代码下载地址不变,先到这里,抽空再优化……
于2015-01-24补充
前段时间,在之前代码的基础上,增加了种读取Excel模版导出的方式。今天,抽空改了改说明,具体如下:
1)在poi/src/replace包中,新增上次补充里POI读取Excel模版的ReplaceExcelServlet.java,供web页面使用;
2)在poi/src/template包中,增加了种读取Excel模版导出的方式,其对应的模版为poi/WebContent/docs/template.xls。请根据实际情况,调整读取和保存Excel的路径后,直接运行TestTemplate.java即可。TemplateServlet.java则对应web页面使用;
最新代码下载地址不变……
于2015-01-31补充
昨晚,在之前代码的基础上,加上本文中可直接运行导出Excel的代码。具体如下:
1)在poi/src/testExport包中,TestExportExcel.java,链接地址:https://github.com/T5750/poi/blob/master/src/testExport/TestExportExcel.java
最新代码下载地址不变……
于2015-02-10补充
在之前代码的基础上,加上可以通过POI导出Excel2007的例子。具体如下:
1)在poi/src/testExport包中,TestExportExcel2007.java,链接地址:https://github.com/T5750/poi/blob/master/src/testExport/TestExportExcel2007.java
于2015-02-12补充
今天,在之前代码的基础上,抽空改了改代码。具体如下:
1)在poi/src/testExport包中, 新增Excel2007Servlet.java。以及,修改相关配置;2)在poi/src/testExport包中,对导出Excel文件进行重命名,便于查看;
3)更新该poi例子对应的帮助文档。
相关文章&源代码下载地址:
-
顶
- 23
-
踩
- 0
我的同类文章
- •Java Double类型如何不科学计数法显示2014-08-20
- •辗转相除法 原理 Java实现2013-11-29
- •Eclipse导入项目,java文件中文乱码的解决方案2014-03-02
- •Java 中的递归2013-11-18
- •排序算法复习(Java实现)2013-03-09
- •Java 中String与StringBuffer的区别2013-02-24
- •字符串匹配的KMP算法2013-12-09
- •Java 多线程 总结2013-11-29
- •Java "equals"和"=="的区别2013-11-18
- •深入浅出之正则表达式2013-05-12
- •Java排序汇总2013-03-09
核心技术类目
- 个人资料
-
- 访问:666978次
- 积分:6430
- 等级:
- 排名:第2362名
- 原创:39篇
- 转载:194篇
- 译文:7篇
- 评论:514条
- 文章分类
- 文章存档
- 2016年04月(1)
- 2015年01月(1)
- 2014年10月(1)
- 2014年09月(2)
- 2014年08月(3)
- 2014年06月(3)
- 2014年04月(5)
- 2014年03月(2)
- 2014年02月(2)
- 2014年01月(8)
- 2013年12月(1)
- 2013年11月(7)
- 2013年10月(2)
- 2013年09月(2)
- 2013年08月(4)
- 2013年07月(2)
- 2013年06月(3)
- 2013年05月(8)
- 2013年04月(2)
- 2013年03月(3)
- 2013年02月(6)
- 2013年01月(9)
- 2012年12月(9)
- 2012年11月(9)
- 2012年10月(9)
- 2012年09月(8)
- 2012年08月(9)
- 2012年07月(15)
- 2012年06月(10)
- 2012年05月(10)
- 2012年04月(10)
- 2012年03月(23)
- 2012年02月(16)
- 2012年01月(13)
- 2011年12月(16)
- 2011年11月(6)
- 阅读排行
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】(92831)
- JS checkbox 选中事件(38960)
- unable to load default svn client 和 Eclipse SVN 插件与TortoiseSVN对应关系(27919)
- Java 二进制与16进制相互转换(21160)
- Java POI 读取Office excel (2003,2007)及相关jar包(20475)
- Eclipse插件之Aptana Studio 3.4.0离线安装包(16276)
- Eclipse插件Properties Editor(中文与Unicode等互转)(15613)
- Java DecimalFormat的主要功能及使用方法(15284)
- Mondrian 使用教程(12767)
- Struts2中s:iterator标签的使用详解(12048)
- 评论排行
- 最新评论
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
evangel_z:@u010168409:你好,不用谢的。试了试jpg和bmp类型,几M的图都正常的。不大清楚你那边的...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
袁忠:首先,非常感谢这篇博文,收获挺大。楼主也非常走心...同时,我也有个问题咨询,我在测试中,图片写不进...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
evangel_z:@fly_to_the_winds:你好,JOptionPane是swing中的,属于C/S端,具体...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
浮生若梦丶:请问,导出完成后,如何给页面返回一个消息,然后页面弹出对话框说“导出成功”?就是这个怎么实现的 JO...
- Eclipse插件之Aptana Studio 3.4.0离线安装包
evangel_z:@C203032S:你好,3.4.0版已发你邮件。
- Eclipse插件之Aptana Studio 3.4.0离线安装包
C203032S:楼主 可以给我一个离线包吗,网上找的都安不起 925907588@qq.com
- Eclipse插件Properties Editor(中文与Unicode等互转)
evangel_z:@proger2012:恭喜恭喜
- Eclipse插件Properties Editor(中文与Unicode等互转)
proger2012:哈哈,我已经装上了
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
evangel_z:@holylightmoon:你好,可能jar包版本或兼容问题,最新代码OK的可结合着看看
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框 【不定期更新】
holylightmoon:楼主你好anchor.setAnchorType(2);这个代码报错了,参数类型不对额
- My Blogs
- evangel_z的支付宝
- 扫扫扫,有钱任性
76楼 袁忠 4天前 15:40发表 [回复]-
-
首先,非常感谢这篇博文,收获挺大。楼主也非常走心...
同时,我也有个问题咨询,我在测试中,图片写不进excel。
检查点:
1.获取的图片的输入流是有大小的;
2.单元格的写入也是对应ok的;
3.图片类型也是匹配的;
4.没有报错,就是写不进去,不知道什么原因?
Re: evangel_z 4天前 16:46发表 [回复]-
-
回复u010168409:你好,不用谢的。试了试jpg和bmp类型,几M的图都正常的。不大清楚你那边的具体情况,请参考最新代码多调试调试
75楼 浮生若梦丶 2016-06-07 15:26发表 [回复]-
-
请问,导出完成后,如何给页面返回一个消息,然后页面弹出对话框说“导出成功”?就是这个怎么实现的 JOptionPane.showMessageDialog(null, "导出成功!");
Re: evangel_z 2016-06-07 16:27发表 [回复]-
-
回复fly_to_the_winds:你好,JOptionPane是swing中的,属于C/S端,具体实现可查看其源码;
B/S端,可通过ajax等方式进行前后台交互,很多弹出框效果等都优于JOptionPane
74楼 holylightmoon 2016-06-03 15:06发表 [回复]-
-
楼主你好
anchor.setAnchorType(2);
这个代码报错了,参数类型不对额
Re: evangel_z 2016-06-03 17:22发表 [回复]-
-
回复holylightmoon:你好,可能jar包版本或兼容问题,最新代码OK的可结合着看看
73楼 苴垳苴沴厝 2016-06-02 15:42发表 [回复]-
-
少了个jar包,servlet-api-2.5.jar
Re: evangel_z 2016-06-02 17:14发表 [回复]-
-
回复u010582739:你好,可能服务器不同吧,本文用的tomcat,servlet-api在其lib中
72楼 kjf00 2016-05-27 17:31发表 [回复]-
-
顺便问一下我将Excel2007Servlet 中的文件后缀.xlsx改为.xls也可以打开,这会不会影响使用啊,话说这虽然不是好学生作为但是好奇
Re: evangel_z 2016-05-27 18:11发表 [回复]-
-
回复k849875005:想法挺好的,但会弹框,跟直接将excel由.xlsx后缀改为.xls类似,做兼容了
71楼 kjf00 2016-05-27 17:14发表 [回复]-
-
你好,请问能否实现下载xlsx文件后后清理tomcat的wabapp包docs文件夹中文件的功能?一直下载岂不是会有很多文件
Re: evangel_z 2016-05-27 17:53发表 [回复]-
-
回复k849875005:你好,可以实现的
70楼 yjclsx 2016-05-05 14:20发表 [回复]-
-
博主,有没有点击导出后会弹出选择路径的框,可以自己选路径的,这样的例子,3q?还有就是为什么要导出一次再download一次,那不就在本地产生了两个相同文件吗,能不能就download一次!
Re: evangel_z 2016-05-05 14:25发表 [回复]-
-
回复yjclsx:你好,不用谢的,可以参考本文Java导出Excel弹出下载框部分,或下载最新代码试试;一个server端另一个client端
69楼 qq_27301375 2016-04-26 22:11发表 [回复]-
-
虽然是个小问题,但我还是想说:博主,test()方法out2的流没关闭呀-
Re: evangel_z 2016-04-27 09:31发表 [回复]-
-
回复qq_27301375:所言极是,已加上,3q
68楼 小红蚂蚁 2016-04-18 13:20发表 [回复]-
-
导出的是在服务器上,不是客户端,客户端怎么导出呢???
Re: evangel_z 2016-04-18 15:01发表 [回复]-
-
回复qq_16578307:你好,可以参考本文Java导出Excel弹出下载框部分,或下载最新代码试试
67楼 zbk09101009 2016-04-15 17:06发表 [回复]-
-
楼主你使用getDeclaredFields(); 来获取bean里的各属性值时,默认是将bean里所有属性都取值了吧?!但是平时用ibatis查询数据的时候,并不一定使用bean里的所有属性的啊。比如某bean,有属性a、b、c,但在从数据库查询数据时这样:select x1 as a, x2 as b from ......这里就没用到属性c,可是使用getDeclaredFields()的话,就将a、b、c三个属性都去出来了。这样问题怎么解决呢?
Re: evangel_z 2016-04-16 15:07发表 [回复]-
-
回复zbk09101009:你好,1.Field[] fields = t.getClass().getDeclaredFields();下边的for循环,可以尝试改造成遇到c属性continue;
2.根据实际情况,也可尝试为Excel单独创建对应的bean;
3.尝试改用Field getDeclaredField(String name)方法等
Re: zbk09101009 2016-04-18 08:49发表 [回复]-
-
嗯嗯,还有个问题哈,页面上是一个表格(表格上面是检索框和导出excel按钮)。这个时候我想导出到excel的话点击那个按钮,此时页面会向后台发送请求吗?如果发送的话,后台根据这个请求会重新去数据库里查询那些与页面上展示的相同的数据吗,还是页面上根据查询条件检索一次就将查询数据转成excel存储起来,请求到来的时候直接读取这个excel文件啊?
Re: evangel_z 2016-04-18 10:43发表 [回复]-
-
回复zbk09101009:通常会向后台发送请求的;
导出Excel请求和页面展示走同一块查询语句即可,分页情况类似;
Excel存储后直接读取Excel需斟酌,因为可能页面上一条记录修改后,存储在Excel中还是修改前的记录。
Re: zbk09101009 2016-04-18 13:45发表 [回复]-
-
谢谢楼主耐心的解答,谢谢!
Re: evangel_z 2016-04-18 14:58发表 [回复]-
-
回复zbk09101009:不用谢的
66楼 xianlietulu792 2016-04-07 10:17发表 [回复]-
-
楼主请问这导入导出有JAVA web 版本的代码嘛??要想写成WEB版该怎么做?
Re: evangel_z 2016-04-10 16:18发表 [回复]-
-
回复xianlietulu792:你好,有的,可以参照本文中的最新代码
Re: xianlietulu792 2016-04-12 16:30发表 [回复]-
-
回复evangel_z:可以发到我的邮箱嘛?1127590547@qq.com谢谢楼主
Re: evangel_z 2016-04-12 17:44发表 [回复]-
-
回复xianlietulu792:已发送,不用谢的
65楼 evangel_z 2016-04-01 16:29发表 [回复]-
-
回复hei_danchaofan:你好,是的,可以尝试跑调度定期清理,或者等客户端下载完后清理等等
Re: 嘿单炒饭 2016-04-05 11:17发表 [回复]-
-
回复evangel_z:大神,再请问下,如果是负载均衡的,就是有不同的服务器,有什么解决办法吗。
Re: evangel_z 2016-04-10 16:19发表 [回复]-
-
回复hei_danchaofan:你好,可以尝试上述方法
64楼 qq_15228953 2016-03-30 14:51发表 [回复]-
-
怎么实现报表路径有后台写死变为前台用户另存为呢,有demo吗
Re: evangel_z 2016-03-30 17:46发表 [回复]-
-
回复qq_15228953:你好,可以通过修改最新代码中的ExcelServlet.java等实现,暂时没有现成demo
63楼 waaayane 2016-03-15 11:45发表 [回复]-
-
你好,我想将数据导出成excel然后将这个excel邮件发送到指定邮箱!这个excel文件是不是一定得先生成?
Re: evangel_z 2016-03-15 15:03发表 [回复]-
-
回复waaayane:你好,以邮件附件发送需要先生成Excel文件的
62楼 hb2112 2016-03-08 13:49发表 [回复]-
-
很好的文章,正在学习中,O(∩_∩)O谢谢了
Re: evangel_z 2016-03-08 16:30发表 [回复]-
-
回复hb2112:不用谢的
61楼 qinzzhi 2016-03-04 09:23发表 [回复]-
-
网上找了半天,有个老师提供这个链接,然后注册csdn,谢谢大师。
Re: evangel_z 2016-03-04 10:52发表 [回复]-
-
回复qinzzhi:不用谢的,过奖了
60楼 DiuDiuDaShen 2016-03-03 10:33发表 [回复]-
-
java.io.FileNotFoundException: null/export2003_a.xls (No such file or directory)
Re: evangel_z 2016-03-03 13:12发表 [回复]-
-
回复DiuDiuDaShen:你好,将类似FileOutputStream("/home/export2003_a.xls")改成你想保存Excel的路径试试
59楼 singlestyle 2016-01-22 16:11发表 [回复]-
-
我看您的是将arraylist导出excel,我想请问如果是map 怎么导出成excel,是要将map 转换成list再导出吗?还是直接map可以导出成excel,另外需要注意数据的格式吗,请问怎么测试格式兼容的问题?
Re: evangel_z 2016-01-22 17:29发表 [回复]-
-
回复singlestyle:你好,直接使用本文代码的话,需将map转换成list再导出。
直接map类型需在exportExcel方法中,从Iterator<T> it = dataset.iterator();开始进行修改。或者,可以尝试map转bean,比如:BeanUtils.populate方法等,看具体需要。
数据格式可参照exportExcel方法
58楼 CJ66 2016-01-21 14:40发表 [回复]-
-
你好, 请问下public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");这个文件在哪?项目里没有?
Re: evangel_z 2016-01-21 14:57发表 [回复]-
-
回复u014036056:你好,这行代码是文件分隔符,为了在Windows系统和Linux系统中公用同一块代码,可以参考这个
https://github.com/T5750/poi/blob/master/src/testExport/ExcelServlet.java
57楼 singlestyle 2016-01-21 12:04发表 [回复]-
-
你好,我在用export 2003的时候,第一次是好用的,点第二次就没有反应了,请问您知道是哪里有问题吗?
Re: evangel_z 2016-01-21 14:48发表 [回复]-
-
回复singlestyle:你好,本文源代码export 2003的两种方法都OK的,可以试试在实际代码导出的地方打个断点,结合控制台调试下;Servlet方式可能跟浏览器设置有关
Re: singlestyle 2016-01-22 15:36发表 [回复]-
-
回复evangel_z:JOptionPane.showMessageDialog(null, "导出成功!");
我把这行注释了就可以了,但不知道原因是什么
Re: evangel_z 2016-01-22 17:35发表 [回复]-
-
回复singlestyle:可能jar包版本有些不兼容吧
56楼 qq_33477055 2016-01-21 11:27发表 [回复]-
-
太感谢了 非常实用!!!
Re: evangel_z 2016-01-21 14:41发表 [回复]-
-
回复qq_33477055:不用谢的
55楼 Hellay2008 2016-01-12 16:08发表 [回复]-
-
赞一个
Re: evangel_z 2016-01-13 09:52发表 [回复]-
-
回复Hellay2008:3q
54楼 final_world 2016-01-06 12:53发表 [回复]-
-
在那里可以加一个大标题啊,就是表头
Re: evangel_z 2016-01-06 15:46发表 [回复]-
-
回复qq_26479457:你好,可以尝试第一行合并单元格作为大标题,在“产生表格标题行”附近,或者读取模版
53楼 zym282738977 2016-01-05 11:36发表 [回复]-
-
这么好的技术贴不点赞可不行~~方法灵活,重用性高。
Re: evangel_z 2016-01-06 09:13发表 [回复]-
-
回复zym282738977:过奖了
52楼 lxaicr 2015-12-31 01:58发表 [回复]-
-
楼主我想问下用Servlet的方法导出后会在工程里写入一个excel,导出多了工程就会很大有什么办法让他导出直接到选的路径下,不是先写到工程里在通过流下载。
Re: evangel_z 2015-12-31 09:32发表 [回复]-
-
回复lxaicr:你好,可以的,在最新代码ExcelServlet.java中,String docsPath = request.getSession().getServletContext().getRealPath("docs");改成相应的逻辑即可
Re: lxaicr 2015-12-31 15:52发表 [回复]-
-
回复evangel_z:嗯嗯 我去研究研究3q
Re: evangel_z 2015-12-31 17:52发表 [回复]-
-
回复lxaicr:no 3q
51楼 努力奔跑的刺猬 2015-12-07 17:08发表 [回复]-
-
非常感谢 很实用的方法
Re: evangel_z 2015-12-08 09:24发表 [回复]-
-
回复baidu_30778261:不用谢的
50楼 iyybpatrick 2015-12-03 13:34发表 [回复]-
-
感谢分享,非常有用~~~
Re: evangel_z 2015-12-03 15:39发表 [回复]-
-
回复iyybpatrick:不用谢的
49楼 城府殿 2015-11-26 17:11发表 [回复]-
-
怎么在web xml注册servlet。。
Re: evangel_z 2015-11-26 17:30发表 [回复]-
-
回复qq_26811549:你好,可以参考这个https://github.com/T5750/poi/blob/master/WebContent/WEB-INF/web.xml
48楼 yueding2705 2015-11-12 17:14发表 [回复]-
-
如果不是javabean的形式,直接从数据库取得的是map类型的数据需要怎么做的
Re: evangel_z 2015-11-13 09:32发表 [回复]-
-
回复u013075664:你好,map类型需在本文exportExcel方法中,从Iterator<T> it = dataset.iterator();开始进行修改。
或者,可以尝试map转bean,比如:BeanUtils.populate方法等,看具体需要
47楼 qw563346743 2015-11-10 16:49发表 [回复]-
-
赞 。楼主 很伟大 。。。谢谢分享。。
Re: evangel_z 2015-11-11 09:14发表 [回复]-
-
回复qw563346743:过奖了,不用谢的
46楼 shen931205 2015-11-04 15:43发表 [回复]-
-
楼主真大神也。至今还不太会用反射
Re: evangel_z 2015-11-04 17:50发表 [回复]-
-
回复shen931205:过奖了
45楼 qq_32399501 2015-10-29 11:01发表 [回复]-
-
很好的文章
Re: evangel_z 2015-10-29 15:56发表 [回复]-
-
回复qq_32399501:3Q,过奖了
44楼 qq_30661193 2015-10-28 15:17发表 [回复]-
-
// 产生表格标题行
这个cell.setCellValue(text); 一直报错是不是放进去的类型不对啊?
还有就是我这边一直找不到import org.apache.poi.hssf.usermodel.HSSFComment;
用的是poi-2.5.1.jar
Re: evangel_z 2015-10-28 16:03发表 [回复]-
-
回复qq_30661193:你好,估计是版本问题,本文jar包可以在这里下载,http://blog.csdn.net/evangel_z/article/details/7312050
43楼 ccl9304 2015-10-20 21:17发表 [回复]-
-
如果是单元格合并的,怎么读取出合并单元个里面的内容呢??求指教~
Re: evangel_z 2015-10-21 10:23发表 [回复]-
-
回复ccl9304:你好,可以参考这个试试,http://blog.csdn.net/evangel_z/article/details/7312050
42楼 yehaox1 2015-09-24 16:12发表 [回复]-
-
楼主,如果在服务端不输出Excel文件,直接将对象输出到客户端成一个Excel需要怎么完成?
Re: evangel_z 2015-09-25 09:35发表 [回复]-
-
回复u014264140:你好,可以尝试下extjs导出excel等
41楼 Senioc 2015-09-09 14:45发表 [回复]-
-
用for循环是到3278条之后就没样式了。
Re: evangel_z 2015-09-11 17:49发表 [回复]-
-
回复Senioc:部分样式确实有问题,原因在于int精度int index = 0;
而在row = sheet.createRow(index);中,参数仅支持int类型,请根据int最大值进行相应处理吧
40楼 Senioc 2015-09-07 17:04发表 [回复]-
-
楼主,你这个导出超过500条后cells样式就不起作用了。。。是什么情况
Re: evangel_z 2015-09-07 17:53发表 [回复]-
-
回复Senioc:你好,可以试试在dataset.add(new Student(10000001, "张三", 20, true, new Date()));这行,改成嵌在for (int i = 0; i < 500; i++) {}中,500行之后有样式的
39楼 _MR_K_ 2015-08-31 11:49发表 [回复]-
-
请问楼主,有没有进度条的功能点代码?
Re: evangel_z 2015-08-31 14:22发表 [回复]-
-
回复u011118289:你好,swing进度条参考地址:http://blog.csdn.net/kakashi8841/article/details/6388797
web进度条参考地址:http://huttoncs.iteye.com/blog/1836256
Re: _MR_K_ 2015-08-31 15:31发表 [回复]-
-
回复evangel_z:我意思是poi 导出的时候显示进度条!
Re: evangel_z 2015-08-31 17:06发表 [回复]-
-
回复u011118289:由于没有现成demo,所以提供了两种方式仅供参考
38楼 u012488642 2015-08-04 18:51发表 [回复]-
-
楼主 你好!想请问 exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd"); 这第一个值(标题)貌似没有用呢? 生成出来的表格没有标题!求解?
Re: evangel_z 2015-08-05 10:06发表 [回复]-
-
回复u012488642:你好,exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd"); 这第一个值(标题)是有用的,它是Excel表格左下角sheet的标题名,具体代码为HSSFSheet sheet = workbook.createSheet(title);
Re: u012488642 2015-08-07 10:46发表 [回复]-
-
回复evangel_z:好吧 看见了~ 谢谢,导出和下载提示框都已成功,但是在导出成功弹出浏览下下载框时后台会报错,但不影响功能的使用。
No result defined for action com.vcooc.action.InnovativeAction and result exportSuccess
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
不知楼主是否知道如何解决?
Re: evangel_z 2015-08-07 13:28发表 [回复]-
-
回复u012488642:不用谢的,后台报错估计是struts中配置exportSuccess的问题
37楼 sinat_18209813 2015-07-09 13:52发表 [回复]-
-
看之前先赞一下热心的楼主
Re: evangel_z 2015-07-09 22:08发表 [回复]-
-
回复sinat_18209813:3Q
36楼 亚历山大啊 2015-05-22 16:01发表 [回复]-
-
我想知道你这个案例导出数据到excel,数据是我随心所欲的要数据,然后照我想要的格式显示出来可以的吗?
Re: evangel_z 2015-05-24 13:48发表 [回复]-
-
回复qq_14952253:你好,需看具体想要的显示格式;或者,试试参照列名(headers)填充内容(dataset)
35楼 dabing9 2015-05-12 10:38发表 [回复]-
-
想请教楼主,如何实现那种点了下载之后弹出一个下载保存的那种弹框的效果啊,按你的servlet的方式试了下,没有出来啊
Re: evangel_z 2015-05-12 13:46发表 [回复]-
-
回复dabing9:你好,最新代码可以的。
1)IE 9,提示保存时,选择另存为即可;
2)Firefox 37,未改下载设置的话,直接会弹出保存文件框;
3)Chrome 41,需要弹出框的话,请在设置中勾选下载前询问每个文件的保存位置