Apache POI-Excel入门与实战

打印 上一主题 下一主题

主题 495|帖子 495|积分 1485

目次
一、了解Apache POI
1.1 什么是Apache POI
1.2 为什么要使用ApaChe POI
1.3 Apache POI应用场景
1.4 Apache POI 依赖
二、Apache POI-Excel 入门案例
2.1 写入Excel文件
2.2 读取文件
四、Apache POI实战
4.1 创建一个获取气候的API
4.2高德气候请求API与响应效果
4.2 后端访问API获取数据
4.3 通过获取地方名称获取AdCode编码
4.4 使用Apache POI包装数据并将预测效果输出到Excel表格中

一、了解Apache POI

1.1 什么是Apache POI


1.2 为什么要使用ApaChe POI


  • 兼容性:POI能够与各种版本的Office文档举行交互,无论是在创建新文件还是在读取旧文件时,都提供了良好的兼容性。
  • 无需Office安装:使用POI可以在没有实际安装Microsoft Office软件的环境下操纵Office文档,这对于服务器环境尤其紧张。
  • 机动性:POI提供了丰富的API,允许开发职员以编程方式对Office文档举行复杂的操纵,如添加公式、图表、图片、样式等。
  • 性能:相比于其他一些办理方案,如使用主动化Office应用步调的方式,POI在处理大量数据时通常具有更好的性能。
  • 安全性:由于POI不需要运行任何Office应用步调,因此可以避免潜在的安全风险,比如宏病毒或恶意脚本的实行。
  • 开源:POI是一个开源项目,这意味着它是免费的,并且有一个活跃的社区支持,可以提供帮助和连续的更新。
1.3 Apache POI应用场景
 


1.4 Apache POI 依赖

  1. <dependency>  
  2.     <groupId>org.apache.poi</groupId>  
  3.     <artifactId>poi</artifactId>  
  4.     <version>3.16</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.apache.poi</groupId>  
  8.     <artifactId>poi-ooxml</artifactId>  
  9.     <version>3.16</version>  
  10. </dependency>
复制代码

二、Apache POI-Excel 入门案例

2.1 写入Excel文件

  1. /**  
  2. * ApachePOI 测试类  
  3. */  
  4. public class ApachePOITest {  
  5.   
  6.     /**  
  7.      * 读取 Excel 文件  
  8.      */  
  9.     public static void write() {  
  10.         // 在内存中创建一个 Excel 文件  
  11.         XSSFWorkbook excel = new XSSFWorkbook();  
  12.         // 创建一个工作表sheet  
  13.         XSSFSheet sheet = excel.createSheet("info");  
  14.         //在sheet中添加表头第1行,RowNum是从0开始的  
  15.         XSSFRow row = sheet.createRow(1);  
  16.         row.createCell(1).setCellValue("姓名");  
  17.         row.createCell(2).setCellValue("年龄");  
  18.   
  19.         //创建一个新的row  
  20.         XSSFRow row2 = sheet.createRow(2);  
  21.         //在row中创建单元格  
  22.         row2.createCell(1).setCellValue("张三");  
  23.         row2.createCell(2).setCellValue("20");  
  24.   
  25.         //创建一个新的row  
  26.         sheet.createRow(3).createCell(1).setCellValue("李四");  
  27.         sheet.getRow(3).createCell(2).setCellValue("30");  
  28.   
  29.         //将excel写入到文件中  
  30.         try {  
  31.             //通过文件输出流将内存中的excel写入到文件中  
  32.             FileOutputStream fileOutputStream = new FileOutputStream("E:" + File.separator + "POITest.xlsx");  
  33.             excel.write(fileOutputStream);  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.   
  38.     }  
  39.   
  40.     public static void main(String[] args) {  
  41.         write();  
  42.     }  
  43.         //关闭流
  44.         excel.close
  45. }
复制代码

2.2 读取文件

  1. /**  
  2. * 读取 Excel 文件  
  3. */  
  4. public  static  void read() throws IOException {  
  5.     //通过文件输入流读取文件  
  6.     FileInputStream fileInputStream = new FileInputStream("E:" + File.separator + "POITest.xlsx");  
  7.     XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);  
  8.     //读取第一个工作表  
  9.     //XSSFSheet sheet = excel.getSheet("info");  
  10.     XSSFSheet sheetAt = excel.getSheetAt(0);  
  11.   
  12.     //获取最后一行的行号  
  13.     int lastRowNum = sheetAt.getLastRowNum();  
  14.     //从第二行开始读取数据  
  15.     for (int i = 1; i <= lastRowNum; i++) {  
  16.         //获取当前行  
  17.         XSSFRow row = sheetAt.getRow(i);  
  18.         //获取当前行的最后一个单元格的编号  
  19.         short lastCellNum = row.getLastCellNum();  
  20.   
  21.         //遍历所有的单元格,从第二个单元格开始  
  22.         for (int j = 1; j < lastCellNum; j++) {  
  23.             System.out.print(row.getCell(j) + "\t");  
  24.         }  
  25.         System.out.println();  
  26.     }  
  27.   
  28.     //关闭流  
  29.     excel.close();  
  30.     fileInputStream.close();  
  31. }
复制代码


四、Apache POI实战

   1.通过读取Excel方法获取一个都会对应的地址编号
  2.通过写入Excel方法将一个都会未来的气候环境写入Excel表格中
  4.1 创建一个获取气候的API

这里使用高德舆图的气候API
创建应用,获取需要的key




4.2高德气候请求API与响应效果

请求API

由于这里的气候需要用到都会编码表,所以先下载好对应的都会编码表格
下载好后内容如下

 返回的Response


APIFOX工具(也可以用postman) 测试:
API地址:https://restapi.amap.com/v3/weather/weatherInfo?parameters


成功返回了数据说明前面一切操纵都是对的。而后端访问则通过HttpClient形式访问

4.2 后端访问API获取数据

引入依赖
  1. <dependency>  
  2.     <groupId>org.apache.httpcomponents</groupId>  
  3.     <artifactId>httpclient</artifactId>  
  4.     <version>4.5.13</version>  
  5. </dependency>
  6. <dependency>
  7.         <groupId>com.alibaba</groupId>
  8.         <artifactId>fastjson</artifactId>
  9.         <version>1.2.76</version>
  10. </dependency>
复制代码
  有了API和都会编码表格,现在我们只需要在用户输入对应的都会大概地域的时候,遍历表格举行读取,如果有对应的区则返回adcode
  测试类:
  1.         @Test
  2.         void WeatherTest() throws URISyntaxException, IOException {
  3. // TODO:这里的key需要引用自己的
  4.                 String key = "xxxxxxx";
  5.                 String city = "110101";
  6.                 CloseableHttpClient httpClient = HttpClients.createDefault();
  7.                 URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");
  8.                 uriBuilder.addParameter("key", key);
  9.                 uriBuilder.addParameter("city", city);
  10.                 HttpGet httpGet = new HttpGet(uriBuilder.build());
  11.                 try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
  12.                         int statusCode = response.getStatusLine().getStatusCode();
  13.                         if (statusCode == 200) {
  14.                                 HttpEntity entity = response.getEntity();
  15.                                 String result = EntityUtils.toString(entity, "UTF-8");
  16.                                 System.out.println(result);
  17.                         } else {
  18.                                 System.out.println("Failed to retrieve data, status code: " + statusCode);
  19.                         }
  20.                 }
  21.                 httpClient.close();
  22.         }
  23. }
复制代码


4.3 通过获取地方名称获取AdCode编码

  1.         @Test
  2.         void AdCodeQuery() throws IOException {
  3. //                TODO:这里输入下载好的地址对照表
  4.                 String AMapFilePath = "E:\\AMap_adcode_citycode.xlsx";
  5. //                需要查询的地址
  6.                 String address = "北京市";
  7.                 FileInputStream fileInputStream = new FileInputStream(AMapFilePath);
  8.                 XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
  9.                 XSSFSheet sheetAt = workbook.getSheetAt(0);
  10.                 for (int i=1;i<sheetAt.getLastRowNum();i++){
  11.                         XSSFCell cell = sheetAt.getRow(i).getCell(0);
  12.                         String stringCellValue = cell.getStringCellValue();
  13.                         if (stringCellValue.equals(address)){
  14.                                 XSSFCell cell1 = sheetAt.getRow(i).getCell(1);
  15.                                 String adcode = cell1.getStringCellValue();
  16.                                 System.out.println("查询到地区编号为"+adcode);
  17.                         }
  18.                 }
  19.         }
复制代码


4.4 使用Apache POI包装数据并将预测效果输出到Excel表格中

  1.         @Test
  2.         void WeatherTest() throws URISyntaxException, IOException {
  3. // TODO:这里的key需要引用自己的
  4.                 String key = "xxxxxxx";
  5.                 String city = "110101";
  6.                 String extensions = "all";
  7.                 CloseableHttpClient httpClient = HttpClients.createDefault();
  8.                 URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");
  9.                 uriBuilder.addParameter("key", key);
  10.                 uriBuilder.addParameter("city", city);
  11.                 uriBuilder.addParameter("extensions",extensions);
  12.                 HttpGet httpGet = new HttpGet(uriBuilder.build());
  13.                 try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
  14.                         int statusCode = response.getStatusLine().getStatusCode();
  15.                         if (statusCode == 200) {
  16.                                 HttpEntity entity = response.getEntity();
  17.                                 String jsonString = EntityUtils.toString(entity, "UTF-8");
  18. //                                通过POI写入文件
  19.                                
  20.                                 // 将JSON字符串解析为Java对象
  21.                                 Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {});
  22.                                 // 获取casts列表
  23.                                 List<Map<String, Object>> casts = (List<Map<String, Object>>) ((List<Map<String, Object>>) map.get("forecasts")).get(0).get("casts");
  24.                                
  25.                                 // 创建Excel工作簿
  26.                                 Workbook workbook = new XSSFWorkbook();
  27.                                 Sheet sheet = workbook.createSheet("Weather Forecasts");
  28.                                
  29.                                 // 创建标题行
  30.                                 Row headerRow = sheet.createRow(0);
  31.                                 CellStyle headerStyle = workbook.createCellStyle();
  32.                                 headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
  33.                                 headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  34.                                
  35.                                 // 写入标题
  36.                                 int cellIndex = 0;
  37.                                 String[] columnHeaders = {"date", "week", "dayweather", "nightweather", "daytemp", "nighttemp", "daywind", "nightwind", "daypower", "nightpower", "daytemp_float", "nighttemp_float"};
  38.                                 for (String columnHeader : columnHeaders) {
  39.                                         Cell cell = headerRow.createCell(cellIndex++);
  40.                                         cell.setCellValue(columnHeader);
  41.                                         cell.setCellStyle(headerStyle);
  42.                                 }
  43.                                 // 创建数据行
  44.                                 int rowIndex = 1;
  45.                                 for (Map<String, Object> cast : casts) {
  46.                                         Row row = sheet.createRow(rowIndex++);
  47.                                         // 写入数据
  48.                                         cellIndex = 0;
  49.                                         for (String columnHeader : columnHeaders) {
  50.                                                 Cell cell = row.createCell(cellIndex++);
  51.                                                 cell.setCellValue(cast.get(columnHeader).toString());
  52.                                         }
  53.                                 }
  54.                                 // 写入Excel文件
  55.                                 try (FileOutputStream fileOut = new FileOutputStream("WeatherForecasts.xlsx")) {
  56.                                         workbook.write(fileOut);
  57.                                 }
  58.                                 // 关闭工作簿
  59.                                 workbook.close();
  60.                         } else {
  61.                                 System.out.println("Failed to retrieve data, status code: " + statusCode);
  62.                         }
  63.                 }
  64.                 httpClient.close();
  65.         }
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表