package org1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Data_Recovery {
    public static void main(String[] args) throws IOException {
        // 创建文件输入流
        FileInputStream inputStream = new FileInputStream('input.xlsx');

        // 创建工作簿对象
        Workbook workbook = new XSSFWorkbook(inputStream);

        // 获取第一个工作表
        Sheet sheet = workbook.getSheetAt(0);

        // 将Excel表格数据转换为二维数组
        double[][] data = new double[sheet.getLastRowNum()+1][sheet.getRow(0).getLastCellNum()];
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                Cell cell = row.getCell(j);
                if (cell.getCellType() == CellType.NUMERIC) {
                    data[i][j] = cell.getNumericCellValue();
                } else {
                    data[i][j] = Double.NaN;
                }
            }
        }

        // 创建KNNAlgorithm对象
        KNNAlgorithm knn = new KNNAlgorithm();

        // 调用KNNAlgorithm的方法进行数据补全处理
        double[][] newData = knn.fillMissingData(data);

        // 检查是否已经存在名为Sheet2的工作表
        Sheet sheet2 = workbook.getSheet('Sheet2');

        // 如果Sheet2工作表已经存在且不为空,则新建一个名为Sheet2_new的工作表
        if (sheet2 != null && sheet2.getLastRowNum() > 0) {
            sheet2 = workbook.createSheet('Sheet2_new');
        } else {
            // 否则直接使用Sheet2工作表
            sheet2 = workbook.getSheet('Sheet2');
        }

        // 将数据写入工作表中
        for (int i = 0; i < newData.length; i++) {
            Row row = sheet2.createRow(i);
            for (int j = 0; j < newData[i].length; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(newData[i][j]);
            }
        }
        // 保存Excel文件
        FileOutputStream outputStream = new FileOutputStream('input.xlsx');
        workbook.write(outputStream);

        // 关闭工作簿和文件输入流、文件输出流
        workbook.close();
        inputStream.close();
        outputStream.close();
    }
}

// 解决办法内容:在KNNAlgorithm类中添加一个名为fillMissingData的方法,该方法接受一个double类型的二维数组作为参数,并返回一个填充了缺失数据的新二维数组。确保方法签名与Data_Recovery中调用的方法签名一致。

代码解释:

  1. **导入必要的库:**代码首先导入了 java.io.* 包用于文件操作,以及 org.apache.poi.ss.usermodel.*org.apache.poi.xssf.usermodel.XSSFWorkbook 包用于操作 Excel 文件。
  2. **创建文件输入流:**使用 FileInputStream 对象读取名为 input.xlsx 的 Excel 文件。
  3. **创建工作簿对象:**使用 XSSFWorkbook 对象创建工作簿,并使用 getSheetAt(0) 获取第一个工作表。
  4. **将 Excel 数据转换为二维数组:**代码遍历 Excel 工作表中的所有行和列,将数据转换为 double 类型的二维数组。对于非数值类型的单元格,使用 Double.NaN 表示缺失值。
  5. **创建 KNNAlgorithm 对象:**创建一个 KNNAlgorithm 对象,用于进行 KNN 算法处理。
  6. **调用 fillMissingData 方法:**使用 knn.fillMissingData(data) 调用 KNN 算法进行数据补全处理。该方法需要在 KNNAlgorithm 类中实现。
  7. **检查 Sheet2 工作表:**代码检查工作簿中是否已经存在名为 Sheet2 的工作表。如果存在且不为空,则创建一个名为 Sheet2_new 的新工作表。否则直接使用 Sheet2 工作表。
  8. **将数据写入工作表:**代码将补全后的数据写入 Sheet2Sheet2_new 工作表中。
  9. **保存 Excel 文件:**使用 FileOutputStream 对象将工作簿保存到名为 input.xlsx 的文件中。
  10. **关闭资源:**最后关闭工作簿、文件输入流和文件输出流。

注意:

  • 代码中省略了 KNNAlgorithm 类,你需要根据自己的需求实现该类,并添加 fillMissingData 方法,该方法接受一个 double 类型的二维数组作为参数,并返回一个填充了缺失数据的新二维数组。
  • 代码中假设 input.xlsx 文件存在于程序运行目录下。
  • 代码示例演示了如何使用 KNN 算法补全 Excel 中的缺失数据,你可以根据具体情况进行调整和修改。
Java Excel 数据补全:使用 KNN 算法修复缺失值

原文地址: https://www.cveoy.top/t/topic/f2gy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录