原文转载:http://blog.csdn.net/evangel_z/article/details/7332535

目录(?)[+]

在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^)

呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。

将3个jar包导入到classpath下,什么?忘了怎么导包?不会吧!好,我们来写一个导出Excel的实用类(所谓实用,是指基本不用怎么修改就可以在实际项目中直接使用的!)。我一直强调做类也好,做方法也好,一定要通用性和灵活性强。下面这个类就算基本贯彻了我的这种思想。那么,熟悉许老师风格的人应该知道,这时候该要甩出一长串代码了。没错,大伙请看:

[java] view plain copy
  1. import java.util.Date;
  2. public class Student
  3. {
  4. private long id;
  5. private String name;
  6. private int age;
  7. private boolean sex;
  8. private Date birthday;
  9. public Student()
  10. {
  11. }
  12. public Student(long id, String name, int age, boolean sex, Date birthday)
  13. {
  14. this.id = id;
  15. this.name = name;
  16. this.age = age;
  17. this.sex = sex;
  18. this.birthday = birthday;
  19. }
  20. public long getId()
  21. {
  22. return id;
  23. }
  24. public void setId(long id)
  25. {
  26. this.id = id;
  27. }
  28. public String getName()
  29. {
  30. return name;
  31. }
  32. public void setName(String name)
  33. {
  34. this.name = name;
  35. }
  36. public int getAge()
  37. {
  38. return age;
  39. }
  40. public void setAge(int age)
  41. {
  42. this.age = age;
  43. }
  44. public boolean getSex()
  45. {
  46. return sex;
  47. }
  48. public void setSex(boolean sex)
  49. {
  50. this.sex = sex;
  51. }
  52. public Date getBirthday()
  53. {
  54. return birthday;
  55. }
  56. public void setBirthday(Date birthday)
  57. {
  58. this.birthday = birthday;
  59. }
  60. }
[java] view plain copy
  1. public class Book
  2. {
  3. private int bookId;
  4. private String name;
  5. private String author;
  6. private float price;
  7. private String isbn;
  8. private String pubName;
  9. private byte[] preface;
  10. public Book()
  11. {
  12. }
  13. public Book(int bookId, String name, String author, float price,
  14. String isbn, String pubName, byte[] preface)
  15. {
  16. this.bookId = bookId;
  17. this.name = name;
  18. this.author = author;
  19. this.price = price;
  20. this.isbn = isbn;
  21. this.pubName = pubName;
  22. this.preface = preface;
  23. }
  24. public int getBookId()
  25. {
  26. return bookId;
  27. }
  28. public void setBookId(int bookId)
  29. {
  30. this.bookId = bookId;
  31. }
  32. public String getName()
  33. {
  34. return name;
  35. }
  36. public void setName(String name)
  37. {
  38. this.name = name;
  39. }
  40. public String getAuthor()
  41. {
  42. return author;
  43. }
  44. public void setAuthor(String author)
  45. {
  46. this.author = author;
  47. }
  48. public float getPrice()
  49. {
  50. return price;
  51. }
  52. public void setPrice(float price)
  53. {
  54. this.price = price;
  55. }
  56. public String getIsbn()
  57. {
  58. return isbn;
  59. }
  60. public void setIsbn(String isbn)
  61. {
  62. this.isbn = isbn;
  63. }
  64. public String getPubName()
  65. {
  66. return pubName;
  67. }
  68. public void setPubName(String pubName)
  69. {
  70. this.pubName = pubName;
  71. }
  72. public byte[] getPreface()
  73. {
  74. return preface;
  75. }
  76. public void setPreface(byte[] preface)
  77. {
  78. this.preface = preface;
  79. }
  80. }

上面这两个类一目了然,就是两个简单的javabean风格的类。再看下面真正的重点类:

[java] view plain copy
  1. import java.io.BufferedInputStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.lang.reflect.Field;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.lang.reflect.Method;
  10. import java.text.SimpleDateFormat;
  11. import java.util.ArrayList;
  12. import java.util.Collection;
  13. import java.util.Date;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.regex.Matcher;
  17. import java.util.regex.Pattern;
  18. import javax.swing.JOptionPane;
  19. import org.apache.poi.hssf.usermodel.HSSFCell;
  20. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  21. import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  22. import org.apache.poi.hssf.usermodel.HSSFComment;
  23. import org.apache.poi.hssf.usermodel.HSSFFont;
  24. import org.apache.poi.hssf.usermodel.HSSFPatriarch;
  25. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  26. import org.apache.poi.hssf.usermodel.HSSFRow;
  27. import org.apache.poi.hssf.usermodel.HSSFSheet;
  28. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  29. import org.apache.poi.hssf.util.HSSFColor;
  30. /**
  31. * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
  32. *
  33. * @author leno
  34. * @version v1.0
  35. * @param <T>
  36. *            应用泛型,代表任意一个符合javabean风格的类
  37. *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
  38. *            byte[]表jpg格式的图片数据
  39. */
  40. public class ExportExcel<T>
  41. {
  42. public void exportExcel(Collection<T> dataset, OutputStream out)
  43. {
  44. exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
  45. }
  46. public void exportExcel(String[] headers, Collection<T> dataset,
  47. OutputStream out)
  48. {
  49. exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
  50. }
  51. public void exportExcel(String[] headers, Collection<T> dataset,
  52. OutputStream out, String pattern)
  53. {
  54. exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
  55. }
  56. /**
  57. * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
  58. *
  59. * @param title
  60. *            表格标题名
  61. * @param headers
  62. *            表格属性列名数组
  63. * @param dataset
  64. *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
  65. *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
  66. * @param out
  67. *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
  68. * @param pattern
  69. *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
  70. */
  71. @SuppressWarnings("unchecked")
  72. public void exportExcel(String title, String[] headers,
  73. Collection<T> dataset, OutputStream out, String pattern)
  74. {
  75. // 声明一个工作薄
  76. HSSFWorkbook workbook = new HSSFWorkbook();
  77. // 生成一个表格
  78. HSSFSheet sheet = workbook.createSheet(title);
  79. // 设置表格默认列宽度为15个字节
  80. sheet.setDefaultColumnWidth((short) 15);
  81. // 生成一个样式
  82. HSSFCellStyle style = workbook.createCellStyle();
  83. // 设置这些样式
  84. style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  85. style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  86. style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  87. style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  88. style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  89. style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  90. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  91. // 生成一个字体
  92. HSSFFont font = workbook.createFont();
  93. font.setColor(HSSFColor.VIOLET.index);
  94. font.setFontHeightInPoints((short) 12);
  95. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  96. // 把字体应用到当前的样式
  97. style.setFont(font);
  98. // 生成并设置另一个样式
  99. HSSFCellStyle style2 = workbook.createCellStyle();
  100. style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
  101. style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  102. style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  103. style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  104. style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
  105. style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
  106. style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  107. style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  108. // 生成另一个字体
  109. HSSFFont font2 = workbook.createFont();
  110. font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  111. // 把字体应用到当前的样式
  112. style2.setFont(font2);
  113. // 声明一个画图的顶级管理器
  114. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  115. // 定义注释的大小和位置,详见文档
  116. HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
  117. 0, 0, 0, (short) 4, 2, (short) 6, 5));
  118. // 设置注释内容
  119. comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
  120. // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
  121. comment.setAuthor("leno");
  122. // 产生表格标题行
  123. HSSFRow row = sheet.createRow(0);
  124. for (short i = 0; i < headers.length; i++)
  125. {
  126. HSSFCell cell = row.createCell(i);
  127. cell.setCellStyle(style);
  128. HSSFRichTextString text = new HSSFRichTextString(headers[i]);
  129. cell.setCellValue(text);
  130. }
  131. // 遍历集合数据,产生数据行
  132. Iterator<T> it = dataset.iterator();
  133. int index = 0;
  134. while (it.hasNext())
  135. {
  136. index++;
  137. row = sheet.createRow(index);
  138. T t = (T) it.next();
  139. // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
  140. Field[] fields = t.getClass().getDeclaredFields();
  141. for (short i = 0; i < fields.length; i++)
  142. {
  143. HSSFCell cell = row.createCell(i);
  144. cell.setCellStyle(style2);
  145. Field field = fields[i];
  146. String fieldName = field.getName();
  147. String getMethodName = "get"
  148. + fieldName.substring(0, 1).toUpperCase()
  149. + fieldName.substring(1);
  150. try
  151. {
  152. Class tCls = t.getClass();
  153. Method getMethod = tCls.getMethod(getMethodName,
  154. new Class[]
  155. {});
  156. Object value = getMethod.invoke(t, new Object[]
  157. {});
  158. // 判断值的类型后进行强制类型转换
  159. String textValue = null;
  160. // if (value instanceof Integer) {
  161. // int intValue = (Integer) value;
  162. // cell.setCellValue(intValue);
  163. // } else if (value instanceof Float) {
  164. // float fValue = (Float) value;
  165. // textValue = new HSSFRichTextString(
  166. // String.valueOf(fValue));
  167. // cell.setCellValue(textValue);
  168. // } else if (value instanceof Double) {
  169. // double dValue = (Double) value;
  170. // textValue = new HSSFRichTextString(
  171. // String.valueOf(dValue));
  172. // cell.setCellValue(textValue);
  173. // } else if (value instanceof Long) {
  174. // long longValue = (Long) value;
  175. // cell.setCellValue(longValue);
  176. // }
  177. if (value instanceof Boolean)
  178. {
  179. boolean bValue = (Boolean) value;
  180. textValue = "男";
  181. if (!bValue)
  182. {
  183. textValue = "女";
  184. }
  185. }
  186. else if (value instanceof Date)
  187. {
  188. Date date = (Date) value;
  189. SimpleDateFormat sdf = new SimpleDateFormat(pattern);
  190. textValue = sdf.format(date);
  191. }
  192. else if (value instanceof byte[])
  193. {
  194. // 有图片时,设置行高为60px;
  195. row.setHeightInPoints(60);
  196. // 设置图片所在列宽度为80px,注意这里单位的一个换算
  197. sheet.setColumnWidth(i, (short) (35.7 * 80));
  198. // sheet.autoSizeColumn(i);
  199. byte[] bsValue = (byte[]) value;
  200. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
  201. 1023, 255, (short) 6, index, (short) 6, index);
  202. anchor.setAnchorType(2);
  203. patriarch.createPicture(anchor, workbook.addPicture(
  204. bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
  205. }
  206. else
  207. {
  208. // 其它数据类型都当作字符串简单处理
  209. textValue = value.toString();
  210. }
  211. // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
  212. if (textValue != null)
  213. {
  214. Pattern p = Pattern.compile("^//d+(//.//d+)?$");
  215. Matcher matcher = p.matcher(textValue);
  216. if (matcher.matches())
  217. {
  218. // 是数字当作double处理
  219. cell.setCellValue(Double.parseDouble(textValue));
  220. }
  221. else
  222. {
  223. HSSFRichTextString richString = new HSSFRichTextString(
  224. textValue);
  225. HSSFFont font3 = workbook.createFont();
  226. font3.setColor(HSSFColor.BLUE.index);
  227. richString.applyFont(font3);
  228. cell.setCellValue(richString);
  229. }
  230. }
  231. }
  232. catch (SecurityException e)
  233. {
  234. e.printStackTrace();
  235. }
  236. catch (NoSuchMethodException e)
  237. {
  238. e.printStackTrace();
  239. }
  240. catch (IllegalArgumentException e)
  241. {
  242. e.printStackTrace();
  243. }
  244. catch (IllegalAccessException e)
  245. {
  246. e.printStackTrace();
  247. }
  248. catch (InvocationTargetException e)
  249. {
  250. e.printStackTrace();
  251. }
  252. finally
  253. {
  254. // 清理资源
  255. }
  256. }
  257. }
  258. try
  259. {
  260. workbook.write(out);
  261. }
  262. catch (IOException e)
  263. {
  264. e.printStackTrace();
  265. }
  266. }
  267. public static void main(String[] args)
  268. {
  269. // 测试学生
  270. ExportExcel<Student> ex = new ExportExcel<Student>();
  271. String[] headers =
  272. { "学号", "姓名", "年龄", "性别", "出生日期" };
  273. List<Student> dataset = new ArrayList<Student>();
  274. dataset.add(new Student(10000001, "张三", 20, true, new Date()));
  275. dataset.add(new Student(20000002, "李四", 24, false, new Date()));
  276. dataset.add(new Student(30000003, "王五", 22, true, new Date()));
  277. // 测试图书
  278. ExportExcel<Book> ex2 = new ExportExcel<Book>();
  279. String[] headers2 =
  280. { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" };
  281. List<Book> dataset2 = new ArrayList<Book>();
  282. try
  283. {
  284. BufferedInputStream bis = new BufferedInputStream(
  285. new FileInputStream("V://book.bmp"));
  286. byte[] buf = new byte[bis.available()];
  287. while ((bis.read(buf)) != -1)
  288. {
  289. //
  290. }
  291. dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",
  292. "清华出版社", buf));
  293. dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",
  294. "阳光出版社", buf));
  295. dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",
  296. "清华出版社", buf));
  297. dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",
  298. "清华出版社", buf));
  299. dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",
  300. "汤春秀出版社", buf));
  301. OutputStream out = new FileOutputStream("E://a.xls");
  302. OutputStream out2 = new FileOutputStream("E://b.xls");
  303. ex.exportExcel(headers, dataset, out);
  304. ex2.exportExcel(headers2, dataset2, out2);
  305. out.close();
  306. out2.close();
  307. JOptionPane.showMessageDialog(null, "导出成功!");
  308. System.out.println("excel导出成功!");
  309. } catch (FileNotFoundException e) {
  310. e.printStackTrace();
  311. } catch (IOException e) {
  312. e.printStackTrace();
  313. }
  314. }
  315. }

写完之后,如果您不是用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代码如下:

[java] view plain copy
  1. public class ExcelServlet extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. (new ExportExcel()).test();
  5. String str = "a.xls";
  6. //String path = request.getSession().getServletContext().getRealPath(str);
  7. download("E://a.xls", response);
  8. }
  9. private void download(String path, HttpServletResponse response) {
  10. try {
  11. // path是指欲下载的文件的路径。
  12. File file = new File(path);
  13. // 取得文件名。
  14. String filename = file.getName();
  15. // 以流的形式下载文件。
  16. InputStream fis = new BufferedInputStream(new FileInputStream(path));
  17. byte[] buffer = new byte[fis.available()];
  18. fis.read(buffer);
  19. fis.close();
  20. // 清空response
  21. response.reset();
  22. // 设置response的Header
  23. response.addHeader("Content-Disposition", "attachment;filename="
  24. + new String(filename.getBytes()));
  25. response.addHeader("Content-Length", "" + file.length());
  26. OutputStream toClient = new BufferedOutputStream(
  27. response.getOutputStream());
  28. response.setContentType("application/vnd.ms-excel;charset=gb2312");
  29. toClient.write(buffer);
  30. toClient.flush();
  31. toClient.close();
  32. } catch (IOException ex) {
  33. ex.printStackTrace();
  34. }
  35. }
  36. }

补充:

于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例子对应的帮助文档。

相关文章&官方文档&源代码下载地址:

Java POI读取Office excel (2003,2007)及相关jar包

最新官方文档:https://poi.apache.org/apidocs/index.html
源代码下载地址:http://download.csdn.net/detail/evangel_z/7834173
最新代码下载地址:https://github.com/T5750/poi

原文转载:http://blog.csdn.net/evangel_z/article/details/7332535

目录(?)[+]

在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^)

呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。

将3个jar包导入到classpath下,什么?忘了怎么导包?不会吧!好,我们来写一个导出Excel的实用类(所谓实用,是指基本不用怎么修改就可以在实际项目中直接使用的!)。我一直强调做类也好,做方法也好,一定要通用性和灵活性强。下面这个类就算基本贯彻了我的这种思想。那么,熟悉许老师风格的人应该知道,这时候该要甩出一长串代码了。没错,大伙请看:

[java] view plain copy
  1. import java.util.Date;
  2. public class Student
  3. {
  4. private long id;
  5. private String name;
  6. private int age;
  7. private boolean sex;
  8. private Date birthday;
  9. public Student()
  10. {
  11. }
  12. public Student(long id, String name, int age, boolean sex, Date birthday)
  13. {
  14. this.id = id;
  15. this.name = name;
  16. this.age = age;
  17. this.sex = sex;
  18. this.birthday = birthday;
  19. }
  20. public long getId()
  21. {
  22. return id;
  23. }
  24. public void setId(long id)
  25. {
  26. this.id = id;
  27. }
  28. public String getName()
  29. {
  30. return name;
  31. }
  32. public void setName(String name)
  33. {
  34. this.name = name;
  35. }
  36. public int getAge()
  37. {
  38. return age;
  39. }
  40. public void setAge(int age)
  41. {
  42. this.age = age;
  43. }
  44. public boolean getSex()
  45. {
  46. return sex;
  47. }
  48. public void setSex(boolean sex)
  49. {
  50. this.sex = sex;
  51. }
  52. public Date getBirthday()
  53. {
  54. return birthday;
  55. }
  56. public void setBirthday(Date birthday)
  57. {
  58. this.birthday = birthday;
  59. }
  60. }
[java] view plain copy
  1. public class Book
  2. {
  3. private int bookId;
  4. private String name;
  5. private String author;
  6. private float price;
  7. private String isbn;
  8. private String pubName;
  9. private byte[] preface;
  10. public Book()
  11. {
  12. }
  13. public Book(int bookId, String name, String author, float price,
  14. String isbn, String pubName, byte[] preface)
  15. {
  16. this.bookId = bookId;
  17. this.name = name;
  18. this.author = author;
  19. this.price = price;
  20. this.isbn = isbn;
  21. this.pubName = pubName;
  22. this.preface = preface;
  23. }
  24. public int getBookId()
  25. {
  26. return bookId;
  27. }
  28. public void setBookId(int bookId)
  29. {
  30. this.bookId = bookId;
  31. }
  32. public String getName()
  33. {
  34. return name;
  35. }
  36. public void setName(String name)
  37. {
  38. this.name = name;
  39. }
  40. public String getAuthor()
  41. {
  42. return author;
  43. }
  44. public void setAuthor(String author)
  45. {
  46. this.author = author;
  47. }
  48. public float getPrice()
  49. {
  50. return price;
  51. }
  52. public void setPrice(float price)
  53. {
  54. this.price = price;
  55. }
  56. public String getIsbn()
  57. {
  58. return isbn;
  59. }
  60. public void setIsbn(String isbn)
  61. {
  62. this.isbn = isbn;
  63. }
  64. public String getPubName()
  65. {
  66. return pubName;
  67. }
  68. public void setPubName(String pubName)
  69. {
  70. this.pubName = pubName;
  71. }
  72. public byte[] getPreface()
  73. {
  74. return preface;
  75. }
  76. public void setPreface(byte[] preface)
  77. {
  78. this.preface = preface;
  79. }
  80. }

上面这两个类一目了然,就是两个简单的javabean风格的类。再看下面真正的重点类:

[java] view plain copy
  1. import java.io.BufferedInputStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.lang.reflect.Field;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.lang.reflect.Method;
  10. import java.text.SimpleDateFormat;
  11. import java.util.ArrayList;
  12. import java.util.Collection;
  13. import java.util.Date;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.regex.Matcher;
  17. import java.util.regex.Pattern;
  18. import javax.swing.JOptionPane;
  19. import org.apache.poi.hssf.usermodel.HSSFCell;
  20. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  21. import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  22. import org.apache.poi.hssf.usermodel.HSSFComment;
  23. import org.apache.poi.hssf.usermodel.HSSFFont;
  24. import org.apache.poi.hssf.usermodel.HSSFPatriarch;
  25. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  26. import org.apache.poi.hssf.usermodel.HSSFRow;
  27. import org.apache.poi.hssf.usermodel.HSSFSheet;
  28. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  29. import org.apache.poi.hssf.util.HSSFColor;
  30. /**
  31. * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
  32. *
  33. * @author leno
  34. * @version v1.0
  35. * @param <T>
  36. *            应用泛型,代表任意一个符合javabean风格的类
  37. *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
  38. *            byte[]表jpg格式的图片数据
  39. */
  40. public class ExportExcel<T>
  41. {
  42. public void exportExcel(Collection<T> dataset, OutputStream out)
  43. {
  44. exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
  45. }
  46. public void exportExcel(String[] headers, Collection<T> dataset,
  47. OutputStream out)
  48. {
  49. exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
  50. }
  51. public void exportExcel(String[] headers, Collection<T> dataset,
  52. OutputStream out, String pattern)
  53. {
  54. exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
  55. }
  56. /**
  57. * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
  58. *
  59. * @param title
  60. *            表格标题名
  61. * @param headers
  62. *            表格属性列名数组
  63. * @param dataset
  64. *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
  65. *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
  66. * @param out
  67. *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
  68. * @param pattern
  69. *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
  70. */
  71. @SuppressWarnings("unchecked")
  72. public void exportExcel(String title, String[] headers,
  73. Collection<T> dataset, OutputStream out, String pattern)
  74. {
  75. // 声明一个工作薄
  76. HSSFWorkbook workbook = new HSSFWorkbook();
  77. // 生成一个表格
  78. HSSFSheet sheet = workbook.createSheet(title);
  79. // 设置表格默认列宽度为15个字节
  80. sheet.setDefaultColumnWidth((short) 15);
  81. // 生成一个样式
  82. HSSFCellStyle style = workbook.createCellStyle();
  83. // 设置这些样式
  84. style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  85. style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  86. style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  87. style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  88. style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  89. style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  90. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  91. // 生成一个字体
  92. HSSFFont font = workbook.createFont();
  93. font.setColor(HSSFColor.VIOLET.index);
  94. font.setFontHeightInPoints((short) 12);
  95. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  96. // 把字体应用到当前的样式
  97. style.setFont(font);
  98. // 生成并设置另一个样式
  99. HSSFCellStyle style2 = workbook.createCellStyle();
  100. style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
  101. style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  102. style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  103. style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  104. style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
  105. style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
  106. style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  107. style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  108. // 生成另一个字体
  109. HSSFFont font2 = workbook.createFont();
  110. font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  111. // 把字体应用到当前的样式
  112. style2.setFont(font2);
  113. // 声明一个画图的顶级管理器
  114. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  115. // 定义注释的大小和位置,详见文档
  116. HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
  117. 0, 0, 0, (short) 4, 2, (short) 6, 5));
  118. // 设置注释内容
  119. comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
  120. // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
  121. comment.setAuthor("leno");
  122. // 产生表格标题行
  123. HSSFRow row = sheet.createRow(0);
  124. for (short i = 0; i < headers.length; i++)
  125. {
  126. HSSFCell cell = row.createCell(i);
  127. cell.setCellStyle(style);
  128. HSSFRichTextString text = new HSSFRichTextString(headers[i]);
  129. cell.setCellValue(text);
  130. }
  131. // 遍历集合数据,产生数据行
  132. Iterator<T> it = dataset.iterator();
  133. int index = 0;
  134. while (it.hasNext())
  135. {
  136. index++;
  137. row = sheet.createRow(index);
  138. T t = (T) it.next();
  139. // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
  140. Field[] fields = t.getClass().getDeclaredFields();
  141. for (short i = 0; i < fields.length; i++)
  142. {
  143. HSSFCell cell = row.createCell(i);
  144. cell.setCellStyle(style2);
  145. Field field = fields[i];
  146. String fieldName = field.getName();
  147. String getMethodName = "get"
  148. + fieldName.substring(0, 1).toUpperCase()
  149. + fieldName.substring(1);
  150. try
  151. {
  152. Class tCls = t.getClass();
  153. Method getMethod = tCls.getMethod(getMethodName,
  154. new Class[]
  155. {});
  156. Object value = getMethod.invoke(t, new Object[]
  157. {});
  158. // 判断值的类型后进行强制类型转换
  159. String textValue = null;
  160. // if (value instanceof Integer) {
  161. // int intValue = (Integer) value;
  162. // cell.setCellValue(intValue);
  163. // } else if (value instanceof Float) {
  164. // float fValue = (Float) value;
  165. // textValue = new HSSFRichTextString(
  166. // String.valueOf(fValue));
  167. // cell.setCellValue(textValue);
  168. // } else if (value instanceof Double) {
  169. // double dValue = (Double) value;
  170. // textValue = new HSSFRichTextString(
  171. // String.valueOf(dValue));
  172. // cell.setCellValue(textValue);
  173. // } else if (value instanceof Long) {
  174. // long longValue = (Long) value;
  175. // cell.setCellValue(longValue);
  176. // }
  177. if (value instanceof Boolean)
  178. {
  179. boolean bValue = (Boolean) value;
  180. textValue = "男";
  181. if (!bValue)
  182. {
  183. textValue = "女";
  184. }
  185. }
  186. else if (value instanceof Date)
  187. {
  188. Date date = (Date) value;
  189. SimpleDateFormat sdf = new SimpleDateFormat(pattern);
  190. textValue = sdf.format(date);
  191. }
  192. else if (value instanceof byte[])
  193. {
  194. // 有图片时,设置行高为60px;
  195. row.setHeightInPoints(60);
  196. // 设置图片所在列宽度为80px,注意这里单位的一个换算
  197. sheet.setColumnWidth(i, (short) (35.7 * 80));
  198. // sheet.autoSizeColumn(i);
  199. byte[] bsValue = (byte[]) value;
  200. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
  201. 1023, 255, (short) 6, index, (short) 6, index);
  202. anchor.setAnchorType(2);
  203. patriarch.createPicture(anchor, workbook.addPicture(
  204. bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
  205. }
  206. else
  207. {
  208. // 其它数据类型都当作字符串简单处理
  209. textValue = value.toString();
  210. }
  211. // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
  212. if (textValue != null)
  213. {
  214. Pattern p = Pattern.compile("^//d+(//.//d+)?$");
  215. Matcher matcher = p.matcher(textValue);
  216. if (matcher.matches())
  217. {
  218. // 是数字当作double处理
  219. cell.setCellValue(Double.parseDouble(textValue));
  220. }
  221. else
  222. {
  223. HSSFRichTextString richString = new HSSFRichTextString(
  224. textValue);
  225. HSSFFont font3 = workbook.createFont();
  226. font3.setColor(HSSFColor.BLUE.index);
  227. richString.applyFont(font3);
  228. cell.setCellValue(richString);
  229. }
  230. }
  231. }
  232. catch (SecurityException e)
  233. {
  234. e.printStackTrace();
  235. }
  236. catch (NoSuchMethodException e)
  237. {
  238. e.printStackTrace();
  239. }
  240. catch (IllegalArgumentException e)
  241. {
  242. e.printStackTrace();
  243. }
  244. catch (IllegalAccessException e)
  245. {
  246. e.printStackTrace();
  247. }
  248. catch (InvocationTargetException e)
  249. {
  250. e.printStackTrace();
  251. }
  252. finally
  253. {
  254. // 清理资源
  255. }
  256. }
  257. }
  258. try
  259. {
  260. workbook.write(out);
  261. }
  262. catch (IOException e)
  263. {
  264. e.printStackTrace();
  265. }
  266. }
  267. public static void main(String[] args)
  268. {
  269. // 测试学生
  270. ExportExcel<Student> ex = new ExportExcel<Student>();
  271. String[] headers =
  272. { "学号", "姓名", "年龄", "性别", "出生日期" };
  273. List<Student> dataset = new ArrayList<Student>();
  274. dataset.add(new Student(10000001, "张三", 20, true, new Date()));
  275. dataset.add(new Student(20000002, "李四", 24, false, new Date()));
  276. dataset.add(new Student(30000003, "王五", 22, true, new Date()));
  277. // 测试图书
  278. ExportExcel<Book> ex2 = new ExportExcel<Book>();
  279. String[] headers2 =
  280. { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" };
  281. List<Book> dataset2 = new ArrayList<Book>();
  282. try
  283. {
  284. BufferedInputStream bis = new BufferedInputStream(
  285. new FileInputStream("V://book.bmp"));
  286. byte[] buf = new byte[bis.available()];
  287. while ((bis.read(buf)) != -1)
  288. {
  289. //
  290. }
  291. dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",
  292. "清华出版社", buf));
  293. dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",
  294. "阳光出版社", buf));
  295. dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",
  296. "清华出版社", buf));
  297. dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",
  298. "清华出版社", buf));
  299. dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",
  300. "汤春秀出版社", buf));
  301. OutputStream out = new FileOutputStream("E://a.xls");
  302. OutputStream out2 = new FileOutputStream("E://b.xls");
  303. ex.exportExcel(headers, dataset, out);
  304. ex2.exportExcel(headers2, dataset2, out2);
  305. out.close();
  306. out2.close();
  307. JOptionPane.showMessageDialog(null, "导出成功!");
  308. System.out.println("excel导出成功!");
  309. } catch (FileNotFoundException e) {
  310. e.printStackTrace();
  311. } catch (IOException e) {
  312. e.printStackTrace();
  313. }
  314. }
  315. }

写完之后,如果您不是用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代码如下:

[java] view plain copy
  1. public class ExcelServlet extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. (new ExportExcel()).test();
  5. String str = "a.xls";
  6. //String path = request.getSession().getServletContext().getRealPath(str);
  7. download("E://a.xls", response);
  8. }
  9. private void download(String path, HttpServletResponse response) {
  10. try {
  11. // path是指欲下载的文件的路径。
  12. File file = new File(path);
  13. // 取得文件名。
  14. String filename = file.getName();
  15. // 以流的形式下载文件。
  16. InputStream fis = new BufferedInputStream(new FileInputStream(path));
  17. byte[] buffer = new byte[fis.available()];
  18. fis.read(buffer);
  19. fis.close();
  20. // 清空response
  21. response.reset();
  22. // 设置response的Header
  23. response.addHeader("Content-Disposition", "attachment;filename="
  24. + new String(filename.getBytes()));
  25. response.addHeader("Content-Length", "" + file.length());
  26. OutputStream toClient = new BufferedOutputStream(
  27. response.getOutputStream());
  28. response.setContentType("application/vnd.ms-excel;charset=gb2312");
  29. toClient.write(buffer);
  30. toClient.flush();
  31. toClient.close();
  32. } catch (IOException ex) {
  33. ex.printStackTrace();
  34. }
  35. }
  36. }

补充:

于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例子对应的帮助文档。

相关文章&官方文档&源代码下载地址:

Java POI读取Office excel (2003,2007)及相关jar包

最新官方文档:https://poi.apache.org/apidocs/index.html
源代码下载地址:http://download.csdn.net/detail/evangel_z/7834173
最新代码下载地址:https://github.com/T5750/poi

Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框相关推荐

  1. JAVA导出excel 直接弹出下载框

    效果展示: 1.首先准备jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>po ...

  2. springmvc导出excel并弹出下载框

    最近做grid列表相关数据导出到excel功能,根据自己选择的列导出成excel 并且下载到本地.废话不说 直接上关键代码: 需要引入相关的包: compile 'org.apache.poi:poi ...

  3. java 文件下载浏览器没有弹出下载框

    原因是我在前端用了ajax请求,后端用了二进制流来实现,而ajax不支持流形式,改成了表单提交解决.

  4. 使用java在windows桌面右下角弹出提示框

    使用java在windows桌面右下角弹出提示框 最终效果图 核心思想 java代码 测试运行 最终效果图 核心思想 使用java.swing.JDialog创建一个窗体对象,设置窗体的展示坐标值以及 ...

  5. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框

    目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...

  6. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  7. Java POI解析Word提取数据存储在Excel

    JavaPOI解析word提取数据到excel 一.了解POI POI以前有了解,这次需求是解析word读取其中标题,还有内容赛选获取自己想要的内容 经过两天的学习,开始熟悉Java这么读取word和 ...

  8. java 弹出下载_java如何实现下载弹出的对话框

    展开全部 Java实现点击下载32313133353236313431303231363533e58685e5aeb931333337396234文件的时候,弹出"另存为"对话框, ...

  9. java 如何关闭会话_java-在会话到期时关闭弹出窗口

    事情是这样的:我的Web应用程序有很多弹出窗口,老板希望在会话期满时关闭它们,因为会话期满并且用户在弹出窗口上按刷新时会显示COZ,正在向他显示登录页面->用户登录->用户被定向到仪表板. ...

最新文章

  1. Java学习总结:32(Runtime类)
  2. kafka基本操作:创建topic、生产/消费消息(同一消费组均分消息;不同消费组订阅消息)
  3. 【STM32】error unknown register name vfpcc in asm的解决方法
  4. 字符串-长度、计数、位置方法演练
  5. python编译2的n次方计算器_用PYTHON2做个计算器,哪位高手能用Python写出计算器的代码,需要加减乘除和退出,谢谢!...
  6. 专家:番茄花园洪磊最高可判刑7年
  7. SQL计算两个日期之间的工作天数
  8. 51nod 1275 连续子段的差异(twopointer+单调队列)
  9. Tenserflow 情感分类
  10. 我在华为度过的 “两辈子”(学习那些在大厂表现优秀的人)
  11. word文档图标变成白纸_word文档图标显示异常怎么办
  12. Unity Shader :实现漫反射与高光反射
  13. 哪些情况会造成小程序违规或下架
  14. 贴片天线的特征模分析及其应用
  15. 利用计算机技术全面规划供应,英语翻译《物流术语》国家标准对供应链管理的定义:利用计算机网络技术全面规划供应链中的商流、物流、信息流、资金流等,并进行...
  16. 小程序map的自定义图标不显示问题
  17. 让电脑死机c语言,秘技:如何悄无声息的让一台电脑死机
  18. python绘制旭日图
  19. MacDroid for Mac(安卓手机文件传输助手)
  20. 荣耀全明星不显示服务器,新版本,新气象!这些荣耀全明星新版本的细节与豆知识你了解吗?...

热门文章

  1. 【HDOJ】1023 Train Problem II_天涯浪子_新浪博客
  2. elementui登录界面的详细介绍
  3. 基于链表的票务管理系统
  4. 组合数学——生成函数
  5. 如何让电脑微信双开呢,两行代码解决问题
  6. java-集合-toString方法
  7. Base64图片保存到本地,及解决图片无法打开问题
  8. 图像分类数据集 (INRIA)
  9. 代码编码格式转为UTF8
  10. SPSS Chi-Square