66. public static void exportExcelByMap(List
67. // 创建工作簿(Excel文件)
68. HSSFWorkbook workbook = new HSSFWorkbook(); 69.
70. // 创建Excel工作簿的第一个Sheet页
71. HSSFSheet sheet = workbook.createSheet(title); 72.
73. // 创建Sheet页的文件头(第一行) 74. createTitle(sheet, strTitle); 75.
76. // 创建Sheet页的文件体(后续行)
77. String[] strArray = strBody.split(\
78. for(int objIndex = 0; objIndex < objList.size(); objIndex++) {
79. Map map = objList.get(objIndex);
80. HSSFRow row = sheet.createRow(objIndex + 1); 81. for(int i = 0; i < strArray.length; i++) { 82. HSSFCell cell = row.createCell(i);
83. cell.setCellType(HSSFCell.CELL_TYPE_STRING); 84. cell.setCellValue(map.get(strArray[i]).toString());
85. } 86. } 87.
88. // 保存Excel文件
89. saveExcelFile(workbook, outputPath); 90. } 91. 92. /**
93. * 导出Excle文档 94. *
95. * @param objList : Excel数据源
96. * @param objClass : Excel数据源中的数据类型 97. * @param title : 新建Sheet的名称 98. * ex: title = \员工表\99. * @param strTitle : Sheet各列的标题(第一行各列的名称) 100. * ex: strTitle = \员工代码,员工姓名,性别,出生日期,籍贯,所属机构,联系电话,电子邮件,助记码\101. * @param strBody : Sheet各列的取值方法名(各列的值在objClass中get方法名称)
102. * ex: strBody = \getBirthday,getHomeplace.getName,getOrg.getShortName,getContactTel,getEmail,getZjm\
103. * @param outputPath: Excel文档保存路径 104. */
105. public static void exportExcelByObject(List objList, Class objClass, String title, String strTitle, String strBody, String outputPath) {
106. // 初始化工作簿
107. HSSFWorkbook workbook = initWorkbook(objList, objClass, title, strTitle, strBody); 108. // 保存Excel文件
109. saveExcelFile(workbook, outputPath); 110. } 111. /**
112. * 初始化工作簿 113. *
114. * @param objList : Excel数据源
115. * @param objClass : Excel数据源中的数据类型 116. * @param title : 新建Sheet的名称 117. * @param strTitle : Sheet各列的标题(第一行各列的名称)
118. * @param strBody : Sheet各列的取值方法名(各列的值在objClass中get方法名称) 119. */
120. private static HSSFWorkbook initWorkbook(List objList, Class objClass, String title, String strTitle, String strBody){
121. // 创建工作簿(Excel文件)
122. HSSFWorkbook workbook = new HSSFWorkbook(); 123.
124. // 创建Excel工作簿的第一个Sheet页
125. HSSFSheet sheet = workbook.createSheet(title); 126.
127. // 创建Sheet页的文件头(第一行) 128. createTitle(sheet, strTitle); 129.
130. // 创建Sheet页的文件体(后续行)
131. createBody(objList, objClass, sheet, strBody); 132.
133. return workbook; 134. } 135. 136. /**
137. * 创建Excel当前sheet页的头信息 138. *
139. * @param sheet : Excel工作簿的一个sheet
140. * @param strTitle : sheet头信息列表(sheet第一行各列值)
141. */
142. private static void createTitle(HSSFSheet sheet, String strTitle){
143. HSSFRow row = sheet.createRow(0); // 创建该页的一行
144. HSSFCell cell = null; 145.
146. String[] strArray = strTitle.split(\147.
148. for(int i = 0; i < strArray.length; i++) {
149. cell = row.createCell(i); // 创建该行的一列 150. cell.setCellType(HSSFCell.CELL_TYPE_STRING); 151. cell.setCellValue(strArray[i]); 152. } 153. 154. } 155. 156. /**
157. * 创建Excel当前sheet页的体信息 158. *
159. * @param objList : Excel数据源
160. * @param objClass : Excel数据源中的数据类型 161. * @param sheet : Excel工作簿的sheet页 162. * @param strBody : Sheet各列的取值方法名(各列的值在objClass中get方法名称) 163. */
164. private static void createBody(List objList, Class objClass, HSSFSheet sheet, String strBody){
165. String[] targetMethod = strBody.split(\166. Method[] ms = objClass.getMethods(); 167.
168. // 循环objList对象列表(生成sheet的行)
169. for(int objIndex = 0; objIndex < objList.size(); objIndex++){
170. Object obj = objList.get(objIndex);
171. HSSFRow row = sheet.createRow(objIndex + 1); 172. // 循环strBody目标方法数组(生成sheet的列) 173. for(int strIndex = 0; strIndex < targetMethod.length; strIndex++) {
174. String targetMethodName = targetMethod[strIndex];
175. // 循环ms方法数组,找到目标方法(strBody中指定的方法)并调用
176. for(int i = 0; i < ms.length; i++) { 177. Method srcMethod = ms[i];
178. int len = targetMethodName.indexOf(\) < 0 ? targetMethodName.length() : targetMethodName.indexOf(\\
179. if (srcMethod.getName().equals(targetMethodName.substring(0, len))) {
180. HSSFCell cell = row.createCell(strIndex);
181. cell.setCellType(HSSFCell.CELL_TYPE_STRING);
182. try {
183. // 如果方法返回一个引用类型的值
184. if (targetMethodName.contains(\
185. cell.setCellValue(referenceInvoke(targetMethodName, obj));
186. // 如果方法返回一个普通属性 187. } else {
188. cell.setCellValue((srcMethod.invoke(obj)).toString());
189. }
190. } catch (Exception e) { 191. e.printStackTrace(); 192. } 193. } 194. } 195. } 196. } 197. 198. } 199. 200. /**
201. * 方法返回的是一个对象的引用(如:getHomeplace.getName类型的方法序列)
202. * 按方法序列逐层调用直到最后放回基本类型的值 203. *
204. * @param targetMethod : obj对象所包含的方法列 205. * @param obj : 待处理的对象
206. * @return
207. */ //getHomeplace.getName emp(obj)
208. private static String referenceInvoke(String targetMethod, Object obj) {
209. // 截取方法序列的第一个方法(即截取属于obj对象的方法:getHomeplace())
210. String refMethod = targetMethod.substring(0, targetMethod.indexOf(\
211. // 获得后续方法序列(getName())
212. targetMethod = targetMethod.substring(targetMethod.indexOf(\213. try {
214. // 获得第一个方法的执行结果(即obj方法执行的结果:obj.getHomeplace())
215. obj = obj.getClass().getMethod(refMethod).invoke(obj);
216. } catch (Exception e) { 217. e.printStackTrace(); 218. } 219.
220. // 如果方法序列没到最后一节
221. if (targetMethod.contains(\
222. return referenceInvoke(targetMethod, obj); 223. // 如果方法序列到达最后一节 224. } else { 225. try {
226. // 通过obj对象获得该方法链的最后一个方法并调用
227. Method tarMethod = obj.getClass().getMethod(targetMethod);
228. return tarMethod.invoke(obj).toString(); 229. } catch (Exception e) { 230. e.printStackTrace();
231. throw new RuntimeException(e); 232. } 233. } 234. 235. } 236. 237. /**
238. * 保存Excel文件 239. *
240. * @param workbook : Excel工作簿