08db3a1c966d38e6ae7b73e2ecc48a2f4734e056.svn-base 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. package cn.com.goldenwater.dcproj.utils.impexcel;
  2. import cn.com.goldenwater.dcproj.utils.ZipUtil;
  3. import cn.com.goldenwater.id.util.UuidUtil;
  4. import org.apache.commons.collections.MapUtils;
  5. import org.apache.commons.io.FileUtils;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  8. import org.apache.poi.ss.usermodel.Row;
  9. import org.apache.poi.ss.usermodel.Sheet;
  10. import org.apache.poi.ss.usermodel.Workbook;
  11. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  12. import org.springframework.web.multipart.MultipartFile;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.io.*;
  15. import java.lang.reflect.InvocationTargetException;
  16. import java.lang.reflect.Method;
  17. import java.net.URLEncoder;
  18. import java.util.*;
  19. import static cn.com.goldenwater.dcproj.utils.expExcel.ExportAbstract.XLS;
  20. import static cn.com.goldenwater.dcproj.utils.export.FieldFormat.formatCheckNull;
  21. import static cn.com.goldenwater.dcproj.utils.impexcel.field.ExcelFieldLists.pblmFieldArrays;
  22. /**
  23. * <p>
  24. * 通用的导出导入工具类
  25. * </p>
  26. *
  27. * @author liyz
  28. * @date 2019/7/19 20:19
  29. **/
  30. public class ExpAndImpUtil {
  31. private static final String SHEET_NAME = "模板文件";
  32. /**
  33. * 功能:判断文件是否存在
  34. */
  35. public static File isExist(String originUrl) throws IOException {
  36. // 判断文件是否存在
  37. File file = new File(originUrl);
  38. if (!file.exists()) {
  39. throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
  40. }
  41. return file;
  42. }
  43. /**
  44. * 下载模板
  45. * @param response HttpServletResponse
  46. * @param list 从数据库里获取到的数据集
  47. * @param filePath 模板文件的路径,带上扩展名,如:D:\DC\template\moban.xls
  48. * @param startRow 从第几行开始写入数据 key行所在的行号-1
  49. * @param sheetName sheet名称
  50. * @throws Exception 异常
  51. */
  52. public static void download(HttpServletResponse response, List<Map<String,Object>> list, String filePath,int startRow,String sheetName) throws Exception{
  53. ByteArrayOutputStream os = new ByteArrayOutputStream();
  54. FileInputStream fis = null;
  55. if(StringUtils.isBlank(sheetName)){
  56. sheetName = SHEET_NAME;
  57. }
  58. try {
  59. // 获取模板
  60. fis = new FileInputStream(isExist(filePath));
  61. String fileExt = filePath.substring(filePath.lastIndexOf(".")).replace(".","");
  62. Workbook workBook = null;
  63. if(XLS.equals(fileExt)){
  64. workBook = new HSSFWorkbook(fis);
  65. }else {
  66. workBook = new XSSFWorkbook(fis);
  67. }
  68. workBook.setSheetName(0, sheetName);
  69. Sheet sheet = workBook.getSheetAt(0);
  70. for (int i = 0; i < list.size(); i++) {
  71. List<String> keys = new ArrayList<>();
  72. Row keyRow = sheet.getRow(startRow);
  73. for(int r=0;r<keyRow.getPhysicalNumberOfCells();r++){
  74. if(!"".equals(keyRow.getCell(r).toString())){
  75. keys.add(keyRow.getCell(r).toString());
  76. }
  77. }
  78. Row creRow = sheet.createRow(startRow + 1 + i);
  79. Map<String,Object> map = list.get(i);
  80. for(int j = 0;j < keys.size(); j++){
  81. Object val = map.get(keys.get(j));
  82. creRow.createCell(j).setCellValue(val == null ? "" : val.toString());
  83. }
  84. }
  85. workBook.write(os);
  86. fis.close();
  87. os.flush();
  88. os.close();
  89. ExportExcel.downloadExcelFile(response, os,sheetName + filePath.substring(filePath.lastIndexOf(".")));
  90. }catch (Exception e){
  91. e.printStackTrace();
  92. }finally {
  93. if(fis != null){
  94. fis.close();
  95. }
  96. os.close();
  97. }
  98. }
  99. /**
  100. * 下载Excel的重载方法(简化常用)
  101. *
  102. * @param response HttpServletResponse
  103. * @param os 字节数据输出流
  104. * @param fileName 文件名称
  105. */
  106. public static void downloadExcelFile(HttpServletResponse response, ByteArrayOutputStream os, String fileName) {
  107. ExportExcel.downloadExcelFile(response,os,fileName);
  108. }
  109. /**
  110. * 下载任意文件的方法
  111. *
  112. * @param response HttpServletResponse
  113. * @param filePath "D:/excel.xls"
  114. * @param fileName "水库问题"
  115. * @throws Exception 异常
  116. */
  117. public static void downloadFile(HttpServletResponse response, String filePath, String fileName) throws Exception {
  118. File file = new File(filePath);
  119. String ext = filePath.substring(filePath.lastIndexOf("."));
  120. fileName = fileName + ext;
  121. if (file.exists()) {
  122. response.setCharacterEncoding("UTF-8");
  123. response.setContentType("application/octet-stream");
  124. response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
  125. InputStream input = new FileInputStream(file);
  126. OutputStream os = response.getOutputStream();
  127. int len = 0;
  128. byte[] buffer = new byte[4096];
  129. while ((len = input.read(buffer, 0, buffer.length)) != -1) {
  130. os.write(buffer, 0, len);
  131. }
  132. input.close();
  133. os.flush();
  134. os.close();
  135. }
  136. }
  137. /**
  138. * 获取Workbook
  139. * @param list 数据集
  140. * @param filePath 模板路径
  141. * @param startRow 开始写入行
  142. * @param sheetName Sheet名称
  143. * @return Workbook
  144. * @throws Exception 异常
  145. */
  146. public static Workbook getWorkbook(List<Map<String,Object>> list, String filePath,int startRow,String sheetName) throws Exception{
  147. if(StringUtils.isBlank(sheetName)){
  148. sheetName = SHEET_NAME;
  149. }
  150. FileInputStream fis = null;
  151. Workbook workBook = null;
  152. try {
  153. // 获取模板
  154. fis = new FileInputStream(isExist(filePath));
  155. String fileExt = filePath.substring(filePath.lastIndexOf(".")+1);
  156. if(XLS.equals(fileExt)){
  157. workBook = new HSSFWorkbook(fis);
  158. }else {
  159. workBook = new XSSFWorkbook(fis);
  160. }
  161. workBook.setSheetName(0, sheetName);
  162. Sheet sheet = workBook.getSheetAt(0);
  163. for (int i = 0; i < list.size(); i++) {
  164. List<String> keys = new ArrayList<>();
  165. Row keyRow = sheet.getRow(startRow);
  166. for(int r=0;r<keyRow.getPhysicalNumberOfCells();r++){
  167. if(!"".equals(keyRow.getCell(r).toString())){
  168. keys.add(keyRow.getCell(r).toString());
  169. }
  170. }
  171. Row creRow = sheet.createRow(startRow + 1 + i);
  172. Map<String,Object> map = list.get(i);
  173. for(int j = 0;j < keys.size(); j++){
  174. Object val = map.get(keys.get(j));
  175. creRow.createCell(j).setCellValue(val == null ? "" : val.toString());
  176. }
  177. }
  178. fis.close();
  179. }catch (Exception e){
  180. e.printStackTrace();
  181. }finally {
  182. if(fis != null){
  183. fis.close();
  184. }
  185. }
  186. return workBook;
  187. }
  188. /**
  189. * 上传文件
  190. * @param file 文件流
  191. * @param folderPath 要存放的文件夹的路径
  192. * @return 生成的文件的路径
  193. * @throws IOException 异常
  194. */
  195. public static String upload(MultipartFile file,String folderPath) throws IOException {
  196. String fileName = UuidUtil.uuid();
  197. // .xls 格式的
  198. String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
  199. File pathFile = new File(folderPath);
  200. if(!pathFile.exists()){
  201. pathFile.mkdirs();
  202. }
  203. FileUtils.copyInputStreamToFile(file.getInputStream(), new File(folderPath, fileName + ext ));
  204. return folderPath + File.separator + fileName + ext;
  205. }
  206. public static String uploadFileZipCommon(MultipartFile file,String folderPath) throws Exception{
  207. // 先存放到一个临时路径,再剪切或复制到图片路径下
  208. String filePath = ExpAndImpUtil.upload(file,folderPath);
  209. //解压到此文件夹
  210. ZipUtil.unzip(new File(filePath), folderPath);
  211. return filePath;
  212. }
  213. /**
  214. * 获取解析后的数据
  215. * @param filePath 文件存储路径
  216. * @param startRow 从第几行开始解析,注意把key那一行带上
  217. * @param clazz 格式化类
  218. * @return 解析后的数据
  219. * @throws IOException 异常
  220. */
  221. public static List<LinkedHashMap<String,Object>> parseData(String filePath, int startRow, Class<?> clazz) throws IOException {
  222. return ImportExcel.getParseData(filePath,startRow,0, clazz);
  223. }
  224. /**
  225. * 功能:把Map转成Bean (主要用于把从Excel解析出来的Map对象还原成实体类对象,方便入库)
  226. */
  227. public static Object convertMapToBean(Class<?> clazz, Map lhp) throws IllegalAccessException, InstantiationException {
  228. return ImportExcel.convertMapToBean(clazz,lhp);
  229. }
  230. /** 用反射简化赋值流程,通过对象和属性名称给Map赋值 */
  231. public static Map<String,Object> convertBeanToMap(Object obj, String[] names,Map map,Class<?> formatClazz) {
  232. if(map == null){
  233. map = new LinkedHashMap<>();
  234. }
  235. if(obj == null){
  236. for (String name : names){
  237. map.put(name,"");
  238. }
  239. return map;
  240. }
  241. Method[] methods = obj.getClass().getMethods();
  242. for(Method method : methods){
  243. for (String name : names){
  244. if(("get"+name).toLowerCase().equals(method.getName().toLowerCase())){
  245. try {
  246. map.put(name,ImportExcel.formatValue(name,formatCheckNull(method.invoke(obj)),formatClazz));
  247. } catch (IllegalAccessException e) {
  248. e.printStackTrace();
  249. } catch (InvocationTargetException e) {
  250. e.printStackTrace();
  251. }
  252. }
  253. }
  254. }
  255. return map;
  256. }
  257. public static List<Map<String,Object>> convertBeanToList(Object list, String[] names, Class<?> clazz) {
  258. List<Map<String,Object>> listMap = new ArrayList<>();
  259. for(Object obj : (List)list){
  260. Map<String,Object> dataMap = ExpAndImpUtil.convertBeanToMap(obj,pblmFieldArrays,null,clazz);
  261. listMap.add(dataMap);
  262. }
  263. return listMap;
  264. }
  265. /**
  266. * 获取展示到前台的数据,反格式化
  267. * @param parseData parseData
  268. * @param clazz 格式化类
  269. * @return showData
  270. * @throws IOException 异常
  271. */
  272. public static List<LinkedHashMap<String,Object>> showData(List<LinkedHashMap<String,Object>> parseData, Class<?> clazz) throws IOException {
  273. return ImportExcel.getShowData(parseData,clazz);
  274. }
  275. public static String getDateFormatPath(String basePath){
  276. return ImpUtil.getDateFormatPath(basePath);
  277. }
  278. /**
  279. * 导出EXCEL时动态创建一个下拉列表
  280. * @param groupNamesList 数据集
  281. * @param firstRow 下拉框从第几行开始,默认最终行结束
  282. * @param firstCol 下拉框从第几列开始
  283. * @return 输出流
  284. */
  285. public static ByteArrayOutputStream createListBox(String[] groupNamesList,int firstRow,int firstCol,Workbook workbook){
  286. return ExportExcel.createListBox(groupNamesList,firstRow,firstCol,workbook);
  287. }
  288. /**
  289. * 导出EXCEL时动态创建一个下拉列表
  290. * @param groupNamesList 数据集
  291. * @param firstRow 下拉框从第几行开始,默认最终行结束
  292. * @param firstCol 下拉框从第几列开始
  293. * @param fis 输入流
  294. * @param bos 输出流
  295. * @return 输出流
  296. */
  297. public static ByteArrayOutputStream createListBox(String[] groupNamesList,int firstRow,int firstCol,FileInputStream fis,ByteArrayOutputStream bos){
  298. return ExportExcel.createListBox(groupNamesList,firstRow,firstCol,fis,bos);
  299. }
  300. /**
  301. * 处理重复的主键,只取第一条,把后面重复的主键都置空
  302. * @param list 原始集合
  303. * @param id 要置空的主键
  304. * @return 处理后的集合
  305. */
  306. public static List<LinkedHashMap<String,Object>> handleRepeatPrimaryKey(List<LinkedHashMap<String,Object>> list,String id){
  307. List<LinkedHashMap<String,Object>> itemList = new ArrayList<>();
  308. for(LinkedHashMap<String,Object> lhm : list){
  309. if(itemList.size() == 0){
  310. itemList.add(lhm);
  311. }else {
  312. ListIterator<LinkedHashMap<String,Object>> listIterator = itemList.listIterator();
  313. int count = 0;
  314. while(listIterator.hasNext()){
  315. LinkedHashMap<String,Object> linkedHashMap = listIterator.next();
  316. if(StringUtils.isNotBlank(MapUtils.getString(linkedHashMap,id))){
  317. if(MapUtils.getString(linkedHashMap,id).equals(MapUtils.getString(lhm,id))){
  318. lhm.put(id,"");
  319. count ++;
  320. }
  321. }
  322. }
  323. if(count == 0){
  324. listIterator.add(lhm);
  325. }
  326. }
  327. }
  328. return list;
  329. }
  330. }