ExcelWriter



1 /**
2 * @author zuzhilong
3 * @date 2013-10-10 下午08:04:02
4 * @desc 生成导出Excel文件对象
5 * @modify
6 * @version 1.0.0
7 */
8 package com.haoyisheng.util;
9
10 import java.io.File;
11 import java.io.FileNotFoundException;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.io.OutputStream;
15 import java.util.Calendar;
16
17 import org.apache.poi.hssf.usermodel.HSSFCell;
18 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
19 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
20 import org.apache.poi.hssf.usermodel.HSSFRow;
21 import org.apache.poi.hssf.usermodel.HSSFSheet;
22 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
23
24 public class ExcelWriter {
25 // 设置cell编码解决中文高位字节截断
26 private static short XLS_ENCODING = HSSFCell.ENCODING_UTF_16;
27
28 // 定制浮点数格式
29 private static String NUMBER_FORMAT = "#,##0.00";
30
31 // 定制日期格式
32 private static String DATE_FORMAT = "m/d/yy"; // "m/d/yy h:mm"
33
34 private OutputStream out = null;
35
36 private HSSFWorkbook workbook = null;
37
38 private HSSFSheet sheet = null;
39
40 private HSSFRow row = null;
41
42 public ExcelWriter() {
43 }
44
45 /**
46 * 初始化Excel
47 *
48 */
49 public ExcelWriter(OutputStream out) {
50 this.out = out;
51 this.workbook = new HSSFWorkbook();
52 this.sheet = workbook.createSheet();
53 }
54
55 /**
56 * 导出Excel文件
57 *
58 * @throws IOException
59 */
60 public void export() throws FileNotFoundException, IOException {
61 try {
62 workbook.write(out);
63 out.flush();
64 out.close();
65 } catch (FileNotFoundException e) {
66 throw new IOException(" 生成导出Excel文件出错! ", e);
67 } catch (IOException e) {
68 throw new IOException(" 写入Excel文件出错! ", e);
69 }
70
71 }
72
73 /**
74 * 增加一行
75 *
76 * @param index
77 * 行号
78 */
79 public void createRow(int index) {
80 this.row = this.sheet.createRow(index);
81 }
82
83 /**
84 * 获取单元格的值
85 *
86 * @param index
87 * 列号
88 */
89 public String getCell(int index) {
90 HSSFCell cell = this.row.getCell((short) index);
91 String strExcelCell = "";
92 if (cell != null) { // add this condition
93 // judge
94 switch (cell.getCellType()) {
95 case HSSFCell.CELL_TYPE_FORMULA:
96 strExcelCell = "FORMULA ";
97 break;
98 case HSSFCell.CELL_TYPE_NUMERIC: {
99 strExcelCell = String.valueOf(cell.getNumericCellValue());
100 }
101 break;
102 case HSSFCell.CELL_TYPE_STRING:
103 strExcelCell = cell.getStringCellValue();
104 break;
105 case HSSFCell.CELL_TYPE_BLANK:
106 strExcelCell = "";
107 break;
108 default:
109 strExcelCell = "";
110 break;
111 }
112 }
113 return strExcelCell;
114 }
115
116 /**
117 * 设置单元格
118 *
119 * @param index
120 * 列号
121 * @param value
122 * 单元格填充值
123 */
124 public void setCell(int index, int value) {
125 HSSFCell cell = this.row.createCell((short) index);
126 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
127 cell.setCellValue(value);
128 }
129
130 /**
131 * 设置单元格
132 *
133 * @param index
134 * 列号
135 * @param value
136 * 单元格填充值
137 */
138 public void setCell(int index, double value) {
139 HSSFCell cell = this.row.createCell((short) index);
140 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
141 cell.setCellValue(value);
142 HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
143 HSSFDataFormat format = workbook.createDataFormat();
144 cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT)); // 设置cell样式为定制的浮点数格式
145 cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式
146 }
147
148 /**
149 * 设置单元格
150 *
151 * @param index
152 * 列号
153 * @param value
154 * 单元格填充值
155 */
156 public void setCell(int index, String value) {
157 HSSFCell cell = this.row.createCell((short) index);
158 cell.setCellType(HSSFCell.CELL_TYPE_STRING);
159 // cell.setEncoding(XLS_ENCODING);
160 cell.setCellValue(value);
161 }
162
163 /**
164 * 设置单元格
165 *
166 * @param index
167 * 列号
168 * @param value
169 * 单元格填充值
170 */
171 public void setCell(int index, Calendar value) {
172 HSSFCell cell = this.row.createCell((short) index);
173 // cell.setEncoding(XLS_ENCODING);
174 cell.setCellValue(value.getTime());
175 HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
176 cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式
177 cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式
178 }
179
180 public static void main(String[] args) {
181 System.out.println(" 开始导出Excel文件 ");
182
183 File f = new File("d:\\qt.xls");
184 ExcelWriter e = new ExcelWriter();
185
186 try {
187 e = new ExcelWriter(new FileOutputStream(f));
188 } catch (FileNotFoundException e1) {
189 e1.printStackTrace();
190 }
191
192 e.createRow(0);
193 e.setCell(0, "试题编码 ");
194 e.setCell(1, "题型");
195 e.setCell(2, "分值");
196 e.setCell(3, "难度");
197 e.setCell(4, "级别");
198 e.setCell(5, "知识点");
199
200 e.createRow(1);
201 e.setCell(0, "t1");
202 e.setCell(1, 1);
203 e.setCell(2, 3.0);
204 e.setCell(3, 1);
205 e.setCell(4, "重要");
206 e.setCell(5, "专业");
207
208 try {
209 e.export();
210 System.out.println(" 导出Excel文件[成功] ");
211 } catch (IOException ex) {
212 System.out.println(" 导出Excel文件[失败] ");
213 ex.printStackTrace();
214 }
215 }
216
217 }


 

ExcelReader



1 /**
2 * @author zuzhilong
3 * @date 2013-10-10 下午08:02:22
4 * @desc 读取xls工具类
5 * @modify
6 * @version 1.0.0
7 */
8 package com.haoyisheng.util;
9
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.IOException;
13 import java.text.DecimalFormat;
14 import java.text.SimpleDateFormat;
15 import java.util.Date;
16
17 import org.apache.poi.hssf.usermodel.HSSFCell;
18 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
19 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
20 import org.apache.poi.hssf.usermodel.HSSFRow;
21 import org.apache.poi.hssf.usermodel.HSSFSheet;
22 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
23 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
24 import org.apache.poi.ss.usermodel.CellStyle;
25
26 public class ExcelReader {
27 // 工作薄,也就是一个excel文件
28 private HSSFWorkbook wb = null;// book [includes sheet]
29 //一个excle文件可以有多个sheet
30 private HSSFSheet sheet = null;
31 // 代表了表的第一行,也就是列名
32 private HSSFRow row = null;
33 // 一个excel有多个sheet,这是其中一个
34 private int sheetNum = 0; // 第sheetnum个工作表
35 // 一个sheet中可以有多行,这里应该是给行数的定义
36 private int rowNum = 0;
37 // 文件输入流
38 private FileInputStream fis = null;
39 // 指定文件
40 private File file = null;
41
42 public ExcelReader() {
43 }
44
45 public ExcelReader(File file) {
46 this.file = file;
47 }
48
49 public void setRowNum(int rowNum) {
50 this.rowNum = rowNum;
51 }
52
53 public void setSheetNum(int sheetNum) {
54 this.sheetNum = sheetNum;
55 }
56
57 public void setFile(File file) {
58 this.file = file;
59 }
60
61 /**
62 * 读取excel文件获得HSSFWorkbook对象
63 */
64 public void open() throws IOException {
65 fis = new FileInputStream(file);
66 wb = new HSSFWorkbook(new POIFSFileSystem(fis));
67 fis.close();
68 }
69
70 /**
71 * 返回sheet表数目
72 *
73 * @return int
74 */
75 public int getSheetCount() {
76 int sheetCount = -1;
77 sheetCount = wb.getNumberOfSheets();
78 return sheetCount;
79 }
80
81 /**
82 * sheetNum下的记录行数
83 *
84 * @return int
85 */
86 public int getRowCount() {
87 if (wb == null)
88 System.out.println("=============>WorkBook为空");
89 HSSFSheet sheet = wb.getSheetAt(this.sheetNum);
90 int rowCount = -1;
91 rowCount = sheet.getLastRowNum();
92 return rowCount;
93 }
94
95 /**
96 * 读取指定sheetNum的rowCount
97 *
98 * @param sheetNum
99 * @return int
100 */
101 public int getRowCount(int sheetNum) {
102 HSSFSheet sheet = wb.getSheetAt(sheetNum);
103 int rowCount = -1;
104 rowCount = sheet.getLastRowNum();
105 return rowCount;
106 }
107
108 /**
109 * 得到指定行的内容
110 *
111 * @param lineNum
112 * @return String[]
113 */
114 public String[] readExcelLine(int lineNum) {
115 return readExcelLine(this.sheetNum, lineNum);
116 }
117
118 /**
119 * 指定工作表和行数的内容
120 *
121 * @param sheetNum
122 * @param lineNum
123 * @return String[]
124 */
125 public String[] readExcelLine(int sheetNum, int lineNum) {
126 if (sheetNum < 0 || lineNum < 0)
127 return null;
128 String[] strExcelLine = null;
129 try {
130 sheet = wb.getSheetAt(sheetNum);
131 row = sheet.getRow(lineNum);
132
133 int cellCount = row.getLastCellNum();
134 strExcelLine = new String[cellCount + 1];
135 for (int i = 0; i <= cellCount; i++) {
136 strExcelLine[i] = readStringExcelCell(lineNum, i);
137 }
138 } catch (Exception e) {
139 e.printStackTrace();
140 }
141 return strExcelLine;
142 }
143
144 /**
145 * 读取指定列的内容
146 *
147 * @param cellNum
148 * @return String
149 */
150 public String readStringExcelCell(int cellNum) {
151 return readStringExcelCell(this.rowNum, cellNum);
152 }
153
154 /**
155 * 指定行和列编号的内容
156 *
157 * @param rowNum
158 * @param cellNum
159 * @return String
160 */
161 public String readStringExcelCell(int rowNum, int cellNum) {
162 return readStringExcelCell(this.sheetNum, rowNum, cellNum);
163 }
164
165 /**
166 * 指定工作表、行、列下的内容
167 *
168 * @param sheetNum
169 * @param rowNum
170 * @param cellNum
171 * @return String
172 */
173 public String readStringExcelCell(int sheetNum, int rowNum, int cellNum) {
174 if (sheetNum < 0 || rowNum < 0)
175 return "";
176 String strExcelCell = "";
177 try {
178 sheet = wb.getSheetAt(sheetNum);
179 row = sheet.getRow(rowNum);
180
181 if (row.getCell((short) cellNum) != null) { // add this condition
182 // judge
183 switch (row.getCell((short) cellNum).getCellType()) {
184 case HSSFCell.CELL_TYPE_FORMULA:
185 strExcelCell = "FORMULA ";
186 break;
187 case HSSFCell.CELL_TYPE_NUMERIC: {
188 if (HSSFDateUtil.isCellDateFormatted(row.getCell((short) cellNum))) {// 处理日期格式、时间格式
189 SimpleDateFormat sdf = null;
190 if (row.getCell((short) cellNum).getCellStyle().getDataFormat() == HSSFDataFormat
191 .getBuiltinFormat("h:mm")) {
192 sdf = new SimpleDateFormat("HH:mm");
193 } else {// 日期
194 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
195 }
196 Date date = row.getCell((short) cellNum).getDateCellValue();
197 strExcelCell = sdf.format(date);
198 } else if (row.getCell((short) cellNum).getCellStyle().getDataFormat() == 58) {
199 // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
200 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
201 double value = row.getCell((short) cellNum).getNumericCellValue();
202 Date date = org.apache.poi.ss.usermodel.DateUtil
203 .getJavaDate(value);
204 strExcelCell = sdf.format(date);
205 } else {
206 double value = row.getCell((short) cellNum).getNumericCellValue();
207 CellStyle style = row.getCell((short) cellNum).getCellStyle();
208 DecimalFormat format = new DecimalFormat("0.0");
209 String temp = style.getDataFormatString();
210 // 单元格设置成常规
211 if (temp.equals("General")) {
212 format.applyPattern("#.#");
213 }
214 strExcelCell = format.format(value);
215 }
216 }
217 break;
218 case HSSFCell.CELL_TYPE_STRING:
219 strExcelCell = row.getCell((short) cellNum)
220 .getStringCellValue();
221 break;
222 case HSSFCell.CELL_TYPE_BLANK:
223 strExcelCell = "";
224 break;
225 default:
226 strExcelCell = "";
227 break;
228 }
229 }
230 } catch (Exception e) {
231 e.printStackTrace();
232 }
233 return strExcelCell;
234 }
235
236 public static void main(String args[]) {
237 File file = new File("d:\\无锡妇幼保健人员对应培训项目确认表(返).xls");
238 ExcelReader readExcel = new ExcelReader(file);
239 try {
240 readExcel.open();
241 } catch (IOException e) {
242 e.printStackTrace();
243 }
244 readExcel.setSheetNum(0); // 设置读取索引为0的工作表
245 // 总行数
246 int count = readExcel.getRowCount();
247 for (int i = 0; i <= count; i++) {
248 String[] rows = readExcel.readExcelLine(i);
249 for (int j = 0; j < rows.length; j++) {
250 System.out.print(rows[j] + " ");
251 }
252 System.out.print("\n");
253 }
254 }
255 }