1.Apache POI简单介绍 



Apache POI是Apache软件基金会的开放源代码函式库。POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 .NET的开发者则能够利用NPOI (POI for .NET) 来存取 POI 的功能。 



2.POI结构 



HSSF - 提供读写Microsoft Excel XLS格式档案的功能。 

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。 

HWPF - 提供读写Microsoft Word DOC格式档案的功能。 

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。 

HDGF - 提供读Microsoft Visio格式档案的功能。

HPBF - 提供读Microsoft Publisher格式档案的功能。 

HSMF - 提供读Microsoft Outlook格式档案的功能。 





參考实例 

在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者財务系统中用的很普遍。由于这些系统常常要做一些报表打印的工作。而数据导出的格式通常是EXCEL或者PDF 



首先我们来导出EXCEL格式的文件吧。

如今主流的操作Excel文件的开源工具有非常多,用得比較多的就是Apache的POI及JExcelAPI。

这里我们用Apache POI!

我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/  或者从我附件下载

  1. package org.leno.export.util;
  2. import java.util.Date;
  3. public class Student {
  4. private long id;
  5. private String name;
  6. private int age;
  7. private boolean sex;
  8. private Date birthday;
  9. public Student() {
  10. super();
  11. // TODO Auto-generated constructor stub
  12. }
  13. public Student(long id, String name, int age, boolean sex, Date birthday) {
  14. super();
  15. this.id = id;
  16. this.name = name;
  17. this.age = age;
  18. this.sex = sex;
  19. this.birthday = birthday;
  20. }
  21. public long getId() {
  22. return id;
  23. }
  24. public void setId(long id) {
  25. this.id = id;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public int getAge() {
  34. return age;
  35. }
  36. public void setAge(int age) {
  37. this.age = age;
  38. }
  39. public boolean getSex() {
  40. return sex;
  41. }
  42. public void setSex(boolean sex) {
  43. this.sex = sex;
  44. }
  45. public Date getBirthday() {
  46. return birthday;
  47. }
  48. public void setBirthday(Date birthday) {
  49. this.birthday = birthday;
  50. }
  51. }
  1. package org.leno.export.util;
  2. public class Book {
  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. super();
  12. }
  13. public Book(int bookId, String name, String author, float price,
  14. String isbn, String pubName, byte[] preface) {
  15. super();
  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. return bookId;
  26. }
  27. public void setBookId(int bookId) {
  28. this.bookId = bookId;
  29. }
  30. public String getName() {
  31. return name;
  32. }
  33. public void setName(String name) {
  34. this.name = name;
  35. }
  36. public String getAuthor() {
  37. return author;
  38. }
  39. public void setAuthor(String author) {
  40. this.author = author;
  41. }
  42. public float getPrice() {
  43. return price;
  44. }
  45. public void setPrice(float price) {
  46. this.price = price;
  47. }
  48. public String getIsbn() {
  49. return isbn;
  50. }
  51. public void setIsbn(String isbn) {
  52. this.isbn = isbn;
  53. }
  54. public String getPubName() {
  55. return pubName;
  56. }
  57. public void setPubName(String pubName) {
  58. this.pubName = pubName;
  59. }
  60. public byte[] getPreface() {
  61. return preface;
  62. }
  63. public void setPreface(byte[] preface) {
  64. this.preface = preface;
  65. }
  66. }

上面这两个类一目了然,就是两个简单的javabean风格的类。

再看以下真正的重点类:

  1. package org.leno.export.util;
  2. import java.io.*;
  3. import java.lang.reflect.*;
  4. import java.util.*;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. import java.text.SimpleDateFormat;
  8. import javax.swing.JOptionPane;
  9. import org.apache.poi.hssf.usermodel.*;
  10. import org.apache.poi.hssf.util.HSSFColor;
  11. /**
  12. * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留下面信息。注明出处!

  13. *
  14. * @author leno
  15. * @version v1.0
  16. * @param <T>
  17. *            应用泛型。代表随意一个符合javabean风格的类
  18. *            注意这里为了简单起见。boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
  19. *            byte[]表jpg格式的图片数据
  20. */
  21. public class ExportExcel<T> {
  22. public void exportExcel(Collection<T> dataset, OutputStream out) {
  23. exportExcel("測试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
  24. }
  25. public void exportExcel(String[] headers, Collection<T> dataset,
  26. OutputStream out) {
  27. exportExcel("測试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
  28. }
  29. public void exportExcel(String[] headers, Collection<T> dataset,
  30. OutputStream out, String pattern) {
  31. exportExcel("測试POI导出EXCEL文档", headers, dataset, out, pattern);
  32. }
  33. /**
  34. * 这是一个通用的方法,利用了JAVA的反射机制,能够将放置在JAVA集合中而且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
  35. *
  36. * @param title
  37. *            表格标题名
  38. * @param headers
  39. *            表格属性列名数组
  40. * @param dataset
  41. *            须要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
  42. *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
  43. * @param out
  44. *            与输出设备关联的流对象,能够将EXCEL文档导出到本地文件或者网络中
  45. * @param pattern
  46. *            假设有时间数据,设定输出格式。默觉得"yyy-MM-dd"
  47. */
  48. @SuppressWarnings("unchecked")
  49. public void exportExcel(String title, String[] headers,
  50. Collection<T> dataset, OutputStream out, String pattern) {
  51. // 声明一个工作薄
  52. HSSFWorkbook workbook = new HSSFWorkbook();
  53. // 生成一个表格
  54. HSSFSheet sheet = workbook.createSheet(title);
  55. // 设置表格默认列宽度为15个字节
  56. );
  57. // 生成一个样式
  58. HSSFCellStyle style = workbook.createCellStyle();
  59. // 设置这些样式
  60. style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  61. style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  62. style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  63. style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  64. style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  65. style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  66. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  67. // 生成一个字体
  68. HSSFFont font = workbook.createFont();
  69. font.setColor(HSSFColor.VIOLET.index);
  70. );
  71. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  72. // 把字体应用到当前的样式
  73. style.setFont(font);
  74. // 生成并设置还有一个样式
  75. HSSFCellStyle style2 = workbook.createCellStyle();
  76. style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
  77. style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  78. style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  79. style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  80. style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
  81. style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
  82. style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  83. style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  84. // 生成还有一个字体
  85. HSSFFont font2 = workbook.createFont();
  86. font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  87. // 把字体应用到当前的样式
  88. style2.setFont(font2);
  89. // 声明一个绘图的顶级管理器
  90. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  91. // 定义凝视的大小和位置,详见文档
  92. ,
  93. , 0, 0, (short) 4, 2, (short) 6, 5));
  94. // 设置凝视内容
  95. comment.setString(new HSSFRichTextString("能够在POI中加入凝视!"));
  96. // 设置凝视作者。当鼠标移动到单元格上是能够在状态栏中看到该内容.
  97. comment.setAuthor("leno");
  98. // 产生表格标题行
  99. );
  100. ; i < headers.length; i++) {
  101. HSSFCell cell = row.createCell(i);
  102. cell.setCellStyle(style);
  103. HSSFRichTextString text = new HSSFRichTextString(headers[i]);
  104. cell.setCellValue(text);
  105. }
  106. // 遍历集合数据,产生数据行
  107. Iterator<T> it = dataset.iterator();
  108. ;
  109. while (it.hasNext()) {
  110. index++;
  111. row = sheet.createRow(index);
  112. T t = (T) it.next();
  113. // 利用反射。依据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
  114. Field[] fields = t.getClass().getDeclaredFields();
  115. ; i < fields.length; i++) {
  116. HSSFCell cell = row.createCell(i);
  117. cell.setCellStyle(style2);
  118. Field field = fields[i];
  119. String fieldName = field.getName();
  120. String getMethodName = "get"
  121. , 1).toUpperCase()
  122. );
  123. try {
  124. Class tCls = t.getClass();
  125. Method getMethod = tCls.getMethod(getMethodName,
  126. new Class[] {});
  127. Object value = getMethod.invoke(t, new Object[] {});
  128. // 推断值的类型后进行强制类型转换
  129. String textValue = null;
  130. // if (value instanceof Integer) {
  131. // int intValue = (Integer) value;
  132. // cell.setCellValue(intValue);
  133. // } else if (value instanceof Float) {
  134. // float fValue = (Float) value;
  135. // textValue = new HSSFRichTextString(
  136. // String.valueOf(fValue));
  137. // cell.setCellValue(textValue);
  138. // } else if (value instanceof Double) {
  139. // double dValue = (Double) value;
  140. // textValue = new HSSFRichTextString(
  141. // String.valueOf(dValue));
  142. // cell.setCellValue(textValue);
  143. // } else if (value instanceof Long) {
  144. // long longValue = (Long) value;
  145. // cell.setCellValue(longValue);
  146. // }
  147. if (value instanceof Boolean) {
  148. boolean bValue = (Boolean) value;
  149. textValue = "男";
  150. if (!bValue) {
  151. textValue = "女";
  152. }
  153. } else if (value instanceof Date) {
  154. Date date = (Date) value;
  155. SimpleDateFormat sdf = new SimpleDateFormat(pattern);
  156. textValue = sdf.format(date);
  157. } else if (value instanceof byte[]) {
  158. // 有图片时,设置行高为60px;
  159. );
  160. // 设置图片所在列宽度为80px,注意这里单位的一个换算
  161. ));
  162. // sheet.autoSizeColumn(i);
  163. byte[] bsValue = (byte[]) value;
  164. , 0,
  165. , 255, (short) 6, index, (short) 6, index);
  166. );
  167. patriarch.createPicture(anchor, workbook.addPicture(
  168. bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
  169. } else {
  170. // 其他数据类型都当作字符串简单处理
  171. textValue = value.toString();
  172. }
  173. // 假设不是图片数据,就利用正則表達式推断textValue是否所有由数字组成
  174. if (textValue != null) {
  175. Pattern p = Pattern.compile("^//d+(//.//d+)?

    {1}quot;");

  176. Matcher matcher = p.matcher(textValue);
  177. if (matcher.matches()) {
  178. // 是数字当作double处理
  179. cell.setCellValue(Double.parseDouble(textValue));
  180. } else {
  181. HSSFRichTextString richString = new HSSFRichTextString(
  182. textValue);
  183. HSSFFont font3 = workbook.createFont();
  184. font3.setColor(HSSFColor.BLUE.index);
  185. richString.applyFont(font3);
  186. cell.setCellValue(richString);
  187. }
  188. }
  189. } catch (SecurityException e) {
  190. // TODO Auto-generated catch block
  191. e.printStackTrace();
  192. } catch (NoSuchMethodException e) {
  193. // TODO Auto-generated catch block
  194. e.printStackTrace();
  195. } catch (IllegalArgumentException e) {
  196. // TODO Auto-generated catch block
  197. e.printStackTrace();
  198. } catch (IllegalAccessException e) {
  199. // TODO Auto-generated catch block
  200. e.printStackTrace();
  201. } catch (InvocationTargetException e) {
  202. // TODO Auto-generated catch block
  203. e.printStackTrace();
  204. } finally {
  205. // 清理资源
  206. }
  207. }
  208. }
  209. try {
  210. workbook.write(out);
  211. } catch (IOException e) {
  212. // TODO Auto-generated catch block
  213. e.printStackTrace();
  214. }
  215. }
  216. public static void main(String[] args) {
  217. // 測试学生
  218. ExportExcel<Student> ex = new ExportExcel<Student>();
  219. String[] headers = { "学号", "姓名", "年龄", "性别", "出生日期" };
  220. List<Student> dataset = new ArrayList<Student>();
  221. , "张三", 20, true, new Date()));
  222. , "李四", 24, false, new Date()));
  223. , "王五", 22, true, new Date()));
  224. // 測试图书
  225. ExportExcel<Book> ex2 = new ExportExcel<Book>();
  226. String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN",
  227. "图书出版社", "封面图片" };
  228. List<Book> dataset2 = new ArrayList<Book>();
  229. try {
  230. BufferedInputStream bis = new BufferedInputStream(
  231. new FileInputStream("book.jpg"));
  232. byte[] buf = new byte[bis.available()];
  233. ) {
  234. //
  235. }
  236. , "jsp", "leno", 300.33f, "1234567",
  237. "清华出版社", buf));
  238. , "java编程思想", "brucl", 300.33f, "1234567",
  239. "阳光出版社", buf));
  240. , "DOM艺术", "lenotang", 300.33f, "1234567",
  241. "清华出版社", buf));
  242. , "c++经典", "leno", 400.33f, "1234567",
  243. "清华出版社", buf));
  244. , "c#入门", "leno", 300.33f, "1234567",
  245. "汤春秀出版社", buf));
  246. OutputStream out = new FileOutputStream("D://a.xls");
  247. OutputStream out2 = new FileOutputStream("D://b.xls");
  248. ex.exportExcel(headers, dataset, out);
  249. ex2.exportExcel(headers2, dataset2, out2);
  250. out.close();
  251. JOptionPane.showMessageDialog(null, "导出成功!");
  252. System.out.println("excel导出成功!");
  253. } catch (FileNotFoundException e) {
  254. // TODO Auto-generated catch block
  255. e.printStackTrace();
  256. } catch (IOException e) {
  257. // TODO Auto-generated catch block
  258. e.printStackTrace();
  259. }
  260. }
  261. }

不行,头有点晕^_^。呵呵,又是泛型,又是反射。又是正則表達式,又是重载,还有多參数列表和POI API。

一下子蹦出来。实在让人吃不消。无论了。顶住看效果先。在本地执行后,我们发如今E://下生成了两份excel文件:学生记录和图书记录,而且中文。数字。颜色。日期,图片等等一且正常。恩,太棒了。有人看到这里開始苦脸了:喂。我怎么一执行就报错啊!呵呵,看看什么错吧!

哦。找不到文件,也就是说你没有book.jpg嘛。

好,拷贝一张小巧的图书图片命名为book.jpg放置到当前project下吧。

注意,您千万别把张桌面大小的图片丢进去了^_^。看到效果了吧。如今我们再来简单梳理一下代码,实际上上面就做了一个导出excel的方法和一个本地測试main()方法。而且代码的结构也非常清晰,仅仅是涉及的知识点略微多一点。

大家细心看看凝视。结合要完毕的功能。应该没有太大问题的。

好啦。吃杯茶,擦把汗,总算把这个类消化掉,你又进步了。

咦,你不是说是在WEB环境下导出的吗?别急。由于导出就是一个下载的过程。我们仅仅须要在server端写一个Jsp或者Servlet组件完毕输出excel到浏览器client的工作就好了。

我们以Servlet为例,还是看代码吧:

  1. package org.leno.export.util;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. /**
  9. * @author leno 使用servlet导出动态生成的excel文件。数据能够来源于数据库
  10. *         这样。浏览器client就能够訪问该servlet得到一份用java代码动态生成的excel文件
  11. */
  12. public class Export extends javax.servlet.http.HttpServlet {
  13. static final long serialVersionUID = 1L;
  14. protected void doGet(HttpServletRequest request,
  15. HttpServletResponse response) throws ServletException, IOException {
  16. File file = new File(getServletContext()
  17. .getRealPath("WEB-INF/book.jpg"));
  18. response.setContentType("octets/stream");
  19. response.addHeader("Content-Disposition",
  20. "attachment;filename=test.xls");
  21. // 測试图书
  22. ExportExcel<Book> ex = new ExportExcel<Book>();
  23. String[] headers = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社",
  24. "封面图片" };
  25. List<Book> dataset = new ArrayList<Book>();
  26. try {
  27. BufferedInputStream bis = new BufferedInputStream(
  28. new FileInputStream(file));
  29. byte[] buf = new byte[bis.available()];
  30. ) {
  31. // 将图片数据存放到缓冲数组中
  32. }
  33. , "jsp", "leno", 300.33f, "1234567", "清华出版社",
  34. buf));
  35. , "java编程思想", "brucl", 300.33f, "1234567",
  36. "阳光出版社", buf));
  37. , "DOM艺术", "lenotang", 300.33f, "1234567",
  38. "清华出版社", buf));
  39. , "c++经典", "leno", 400.33f, "1234567",
  40. "清华出版社", buf));
  41. , "c#入门", "leno", 300.33f, "1234567",
  42. "汤春秀出版社", buf));
  43. OutputStream out = response.getOutputStream();
  44. ex.exportExcel(headers, dataset, out);
  45. out.close();
  46. System.out.println("excel导出成功。");
  47. } catch (FileNotFoundException e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. } catch (IOException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. }
  55. protected void doPost(HttpServletRequest request,
  56. HttpServletResponse response) throws ServletException, IOException {
  57. doGet(request, response);
  58. }
  59. }

写完之后,假设您不是用eclipse工具生成的Servlet,千万别忘了在web.xml上注冊这个Servelt。我用的是Eclipse工具生成的servlet。自己主动注冊了servlet,注冊内容例如以下: 



<servlet> 

    <servlet-name>Export</servlet-name> 

    <servlet-class>org.leno.export.util.Export</servlet-class> 

  </servlet> 



<servlet-mapping> 

    <servlet-name>Export</servlet-name> 

    <url-pattern>/servlet/Export</url-pattern> 

  </servlet-mapping> 



我的訪问地址是:http://localhost:8080/export/servlet/Export。

看看是不是下载成功了。

呵呵,您能够将下载到本地的excel报表用打印机打印出来,这样您就大功告成了。

完事了我们就思考:我们发现,我们做的方法。无论是本地调用。还是在WEBserver端用Servlet调用;无论是输出学生列表,还是图书列表信息。代码都差点儿一样。并且这些数据我们非常容器结合后台的DAO操作数据库动态获取。恩。类和方法的通用性和灵活性開始有点感觉 



生成的两个excel文档内容分别例如以下,第一个是測试学生,第二个是測试图书。 



 



这张有空姐为我们加油,亚麻带 





Java学习之道:Java 导出EXCEL的更多相关文章

  1. Java学习之道:Java项目打包发布

    Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...

  2. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  3. Java学习之道:Java操作Excel之导出下载

    页面放置一个button进行点击导出事件 <h:commandLink target="_parent" value="导出"            ac ...

  4. 摘自:java夜未眠之java学习之道

    目前Java可以说是产业界和学术界最热门的语言,许多读者都很急切想把Java学好.除非是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是免不了的.花时间,不打紧,就是怕方法错误,事倍功半.我认为 ...

  5. Java利用POI实现导入导出Excel表格示例代码

    转自:https://www.jb51.net/article/95526.htm 介绍 Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其 ...

  6. JAVA 通过POI 模版,导出excel

    如有不足,欢迎指正,谢谢 ! 1.Maven引入  POI jar包.模版和结果文件.rar下载 <dependency> <groupId>org.apache.poi< ...

  7. Java学习之道:空指针错误求解救????????????

    运行下面这个主方法红色代码的地方就报如下错: https://api.weibo.com/2/users/show.json?access_token=2.00szM9cCc4R_EC6ebcf150 ...

  8. Java学习之道:jdk环境变量配置方法

    JDK(Java Development Kit)是整个Java的核心,包含了Java执行环境.Java工具和Java基础类库.JDK作为JAVA开发的环境,无论是做JAVA开发还是做安卓开发,都必须 ...

  9. Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

随机推荐

  1. HDU1412 {A} + {B}

    2019-05-17 10:15:01 每个元素之间有一个空格隔开. 每行最后一的元素后面没有空格,区别于HDU人见人爱A - B 注意使用STL的时候要清空 .  a.clear(); #inclu ...

  2. 基于Apache Thrift的公路涵洞数据交互实现原理

    基于Apache Thrift的公路涵洞数据交互实现原理 Apache Thrift简介 Apache Thrift(以下简称为“Thrift”) 是 Facebook 实现的一种高效的.支持多种编程 ...

  3. Docker installs

    docker要求系统内核必须在3.10以上uname -r 命令查看你当前的内核版本 1.更新yum源并删除旧版docker yum remove docker docker-common docke ...

  4. C-C语言概述

    1.数据+算法=程序. 2.C语言程序是由一个或多个函数组成的,函数是由语句组成的,语句是由关键字,标识符,运算符,数据组成的:语句可分为:声明语句,赋值语句,控制语句,函数语句,空语句. 3.#in ...

  5. HTML与CCS(十一)

    1.1 HTML介绍 1.1.1 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) s ...

  6. 企业级Spring应用的搭建

    本次博客将要对SpringMVC做简单的介绍以及环境的搭建: 概述 Spring 框架是一个开源的平台,属于设计层面框架,整个系统面向接口,是分层的JavaSE/EE开源框架,用于解决复杂的企业应用开 ...

  7. javascript中构造函数的三种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. FAQ: SBS 2011. The Windows SBS Manager service terminated unexpectedly

    Symptoms The Windows SBS Manager service is stopped with EventID 7034 every half an hour on SBS 2011 ...

  9. vim 常用操作笔记

    跳转最后一行 :$ 或 shift+g 跳转第一行 :1 或 gg 设置自动换行 :set wrap 设置不自动换行 :set nowrap

  10. Javase 简单练习

    public class Test10 { public static void main(String[] args) { System.out.println("------------ ...