您的位置:首页 > 编程语言 > Java开发

java项目中Excel文件的导入导出

2017-09-25 21:20 721 查看
1 package poi.excel;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.lang.reflect.Field;
7 import java.lang.reflect.Method;
8 import java.util.ArrayList;
9 import java.util.List;
10
11 import javax.servlet.http.HttpServletRequest;
12
13 import org.apache.log4j.Logger;
14 import org.apache.poi.hssf.usermodel.HSSFCell;
15 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
16 import org.apache.poi.hssf.usermodel.HSSFFont;
17 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
18 import org.apache.poi.hssf.usermodel.HSSFRow;
19 import org.apache.poi.hssf.usermodel.HSSFSheet;
20 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
21 import org.apache.poi.hssf.util.HSSFColor;
22 import org.apache.poi.ss.usermodel.Cell;
23 import org.apache.poi.ss.usermodel.Row;
24 import org.apache.poi.ss.usermodel.Sheet;
25 import org.apache.poi.ss.usermodel.Workbook;
26 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
27
28
29
30 /**
31 * @ClassName: ExcelUtil
32 * @Description: Excel导入导出工具类
33 * @author 周宣
34 * @date 2016-11-8 下午7:16:11
35 *
36 */
37 public class ExcelUtil {
38     private static final Logger logger = Logger.getLogger(ExcelUtil.class);
39
40     /**
41     * @Title: createWorkbook
42     * @Description: 判断excel文件后缀名,生成不同的workbook
43     * @param @param is
44     * @param @param excelFileName
45     * @param @return
46     * @param @throws IOException
47     * @return Workbook
48     * @throws
49     */
50     public Workbook createWorkbook(InputStream is,String excelFileName) throws IOException{
51         if (excelFileName.endsWith(".xls")) {
52             return new HSSFWorkbook(is);
53         }else if (excelFileName.endsWith(".xlsx")) {
54             return new XSSFWorkbook(is);
55         }
56         return null;
57     }
58
59     /**
60     * @Title: getSheet
61     * @Description: 根据sheet索引号获取对应的sheet
62     * @param @param workbook
63     * @param @param sheetIndex
64     * @param @return
65     * @return Sheet
66     * @throws
67     */
68     public Sheet getSheet(Workbook workbook,int sheetIndex){
69         return workbook.getSheetAt(0);
70     }
71
72     /**
73     * @Title: importDataFromExcel
74     * @Description: 将sheet中的数据保存到list中,
75     * 1、调用此方法时,vo的属性个数必须和excel文件每行数据的列数相同且一一对应,vo的所有属性都为String
76     * 2、在action调用此方法时,需声明
77     *     private File excelFile;上传的文件
78     *     private String excelFileName;原始文件的文件名
79     * 3、页面的file控件name需对应File的文件名
80     * @param @param vo javaBean
81     * @param @param is 输入流
82     * @param @param excelFileName
83     * @param @return
84     * @return List<Object>
85     * @throws
86     */
87     public List<Object> importDataFromExcel(Object vo,InputStream is,String excelFileName){
88         List<Object> list = new ArrayList<Object>();
89         try {
90             //创建工作簿
91             Workbook workbook = this.createWorkbook(is, excelFileName);
92             //创建工作表sheet
93             Sheet sheet = this.getSheet(workbook, 0);
94             //获取sheet中数据的行数
95             int rows = sheet.getPhysicalNumberOfRows();
96             //获取表头单元格个数
97             int cells = sheet.getRow(0).getPhysicalNumberOfCells();
98             //利用反射,给JavaBean的属性进行赋值
99             Field[] fields = vo.getClass().getDeclaredFields();
100             for (int i = 1; i < rows; i++) {//第一行为标题栏,从第二行开始取数据
101                 Row row = sheet.getRow(i);
102                 int index = 0;
103                 while (index < cells) {
104                     Cell cell = row.getCell(index);
105                     if (null == cell) {
106                         cell = row.createCell(index);
107                     }
108                     cell.setCellType(Cell.CELL_TYPE_STRING);
109                     String value = null == cell.getStringCellValue()?"":cell.getStringCellValue();
110
111                     Field field = fields[index];
112                     String fieldName = field.getName();
113                     String methodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
114                     Method setMethod = vo.getClass().getMethod(methodName, new Class[]{String.class});
115                     setMethod.invoke(vo, new Object[]{value});
116                     index++;
117                 }
118                 if (isHasValues(vo)) {//判断对象属性是否有值
119                     list.add(vo);
120                     vo.getClass().getConstructor(new Class[]{}).newInstance(new Object[]{});//重新创建一个vo对象
121                 }
122
123             }
124         } catch (Exception e) {
125             logger.error(e);
126         }finally{
127             try {
128                 is.close();//关闭流
129             } catch (Exception e2) {
130                 logger.error(e2);
131             }
132         }
133         return list;
134
135     }
136
137     /**
138     * @Title: isHasValues
139     * @Description: 判断一个对象所有属性是否有值,如果一个属性有值(分空),则返回true
140     * @param @param object
141     * @param @return
142     * @return boolean
143     * @throws
144     */
145     public boolean isHasValues(Object object){
146         Field[] fields = object.getClass().getDeclaredFields();
147         boolean flag = false;
148         for (int i = 0; i < fields.length; i++) {
149             String fieldName = fields[i].getName();
150             String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
151             Method getMethod;
152             try {
153                 getMethod = object.getClass().getMethod(methodName);
154                 Object obj = getMethod.invoke(object);
155                 if (null != obj && "".equals(obj)) {
156                     flag = true;
157                     break;
158                 }
159             } catch (Exception e) {
160                 logger.error(e);
161             }
162
163         }
164         return flag;
165
166     }
167
168     public <T> void exportDataToExcel(List<T> list,String[] headers,String title,OutputStream os){
169         HSSFWorkbook workbook = new HSSFWorkbook();
170         //生成一个表格
171         HSSFSheet sheet = workbook.createSheet(title);
172         //设置表格默认列宽15个字节
173         sheet.setDefaultColumnWidth(15);
174         //生成一个样式
175         HSSFCellStyle style = this.getCellStyle(workbook);
176         //生成一个字体
177         HSSFFont font = this.getFont(workbook);
178         //把字体应用到当前样式
179         style.setFont(font);
180
181         //生成表格标题
182         HSSFRow row = sheet.createRow(0);
183         row.setHeight((short)300);
184         HSSFCell cell = null;
185
186         for (int i = 0; i < headers.length; i++) {
187             cell = row.createCell(i);
188             cell.setCellStyle(style);
189             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
190             cell.setCellValue(text);
191         }
192
193         //将数据放入sheet中
194         for (int i = 0; i < list.size(); i++) {
195             row = sheet.createRow(i+1);
196             T t = list.get(i);
197             //利用反射,根据JavaBean属性的先后顺序,动态调用get方法得到属性的值
198             Field[] fields = t.getClass().getFields();
199             try {
200                 for (int j = 0; j < fields.length; j++) {
201                     cell = row.createCell(j);
202                     Field field = fields[j];
203                     String fieldName = field.getName();
204                     String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
205                     Method getMethod = t.getClass().getMethod(methodName,new Class[]{});
206                     Object value = getMethod.invoke(t, new Object[]{});
207
208                     if(null == value)
209                         value ="";
210                     cell.setCellValue(value.toString());
211
212                 }
213             } catch (Exception e) {
214                 logger.error(e);
215             }
216         }
217
218         try {
219             workbook.write(os);
220         } catch (Exception e) {
221             logger.error(e);
222         }finally{
223             try {
224                 os.flush();
225                 os.close();
226             } catch (IOException e) {
227                 logger.error(e);
228             }
229         }
230
231     }
232
233     /**
234     * @Title: getCellStyle
235     * @Description: 获取单元格格式
236     * @param @param workbook
237     * @param @return
238     * @return HSSFCellStyle
239     * @throws
240     */
241     public HSSFCellStyle getCellStyle(HSSFWorkbook workbook){
242         HSSFCellStyle style = workbook.createCellStyle();
243         style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
244         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
245         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
246         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
247         style.setLeftBorderColor(HSSFCellStyle.BORDER_THIN);
248         style.setRightBorderColor(HSSFCellStyle.BORDER_THIN);
249         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
250
251         return style;
252     }
253
254     /**
255     * @Title: getFont
256     * @Description: 生成字体样式
257     * @param @param workbook
258     * @param @return
259     * @return HSSFFont
260     * @throws
261     */
262     public HSSFFont getFont(HSSFWorkbook workbook){
263         HSSFFont font = workbook.createFont();
264         font.setColor(HSSFColor.WHITE.index);
265         font.setFontHeightInPoints((short)12);
266         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
267         return font;
268     }
269
270     public boolean isIE(HttpServletRequest request){
271         return request.getHeader("USER-AGENT").toLowerCase().indexOf("msie")>0?true:false;
272     }
273 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: