package Data_Recovery;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

public class EM03 {
    public static void main(String[] args) {
        try {
            // 读取input-2.xlsx文件
            FileInputStream file = new FileInputStream('input-2.xlsx');
            Workbook workbook = new XSSFWorkbook(file);
            Sheet sheet = workbook.getSheet('P1');

            // 检查是否存在P2工作表,如果存在则删除
            if (workbook.getSheet('P2') != null) {
                workbook.removeSheetAt(workbook.getSheetIndex('P2'));
            }

            // 创建新的P2工作表
            Sheet newSheet = workbook.createSheet('P2');

            // 复制P1工作表的单元格格式到P2工作表
            copyCellStyle(sheet, newSheet);

            // 获取P1工作表第一列的时间日期数据
            List<Date> dates = getColumnValues(sheet);

            // 进行日期插入操作
            List<Date> newDates = insertDates(dates);

            // 将插入后的日期写入P2工作表
            writeColumnValues(newSheet, newDates);

            // 保存结果到input-2.xlsx文件
            FileOutputStream outFile = new FileOutputStream('input-2.xlsx');
            workbook.write(outFile);
            outFile.close();

            System.out.println('操作完成');
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 复制单元格格式
    private static void copyCellStyle(Sheet sourceSheet, Sheet targetSheet) {
        for (int rowIndex = 0; rowIndex <= sourceSheet.getLastRowNum(); rowIndex++) {
            Row sourceRow = sourceSheet.getRow(rowIndex);
            Row targetRow = targetSheet.createRow(rowIndex);

            for (int columnIndex = 0; columnIndex < sourceRow.getLastCellNum(); columnIndex++) {
                Cell sourceCell = sourceRow.getCell(columnIndex);
                Cell targetCell = targetRow.createCell(columnIndex);

                if (sourceCell != null) {
                    CellStyle style = sourceCell.getCellStyle();
                    targetCell.setCellStyle(style);
                }
            }
        }
    }

    // 获取指定列的日期数据
    private static List<Date> getColumnValues(Sheet sheet) {
        List<Date> columnValues = new ArrayList<>();

        for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
            Row row = sheet.getRow(rowIndex);

            if (row != null) {
                Cell cell = row.getCell(0);

                if (cell != null && cell.getCellType() == CellType.NUMERIC) {
                    columnValues.add(cell.getDateCellValue());
                }
            }
        }

        return columnValues;
    }

    // 在日期数据中插入中间值,直至相邻日期间隔小于10天
    private static List<Date> insertDates(List<Date> dates) {
        List<Date> newDates = new ArrayList<>(dates);
        int originalSize = newDates.size();
        int maxSize = originalSize * 2; // 设置插入的日期数量阈值
        int insertCount = 0; // 插入计数器

        for (int i = 0; i < newDates.size() - 1; i++) {
            Date currentDate = newDates.get(i);
            Date nextDate = newDates.get(i + 1);

            long interval = (nextDate.getTime() - currentDate.getTime()) / (24 * 60 * 60 * 1000);

            if (interval > 10) { // 修改条件为大于10天
                while (interval > 10 && newDates.size() < maxSize && insertCount < 100) { // 修改条件为大于10天,并添加日期数量限制条件和插入计数器
                    Date middleDate = new Date((currentDate.getTime() + nextDate.getTime()) / 2);
                    if (!newDates.contains(middleDate)) {
                        newDates.add(i + 1, middleDate);
                        insertCount++;
                    }
                    interval = (nextDate.getTime() - middleDate.getTime()) / (24 * 60 * 60 * 1000);
                    nextDate = newDates.get(i + 2); // 更新相邻日期
                }
            }
        }

        return newDates;
    }

    // 将日期数据写入指定列
    private static void writeColumnValues(Sheet sheet, List<Date> dates) {
        new SimpleDateFormat('yyyy-MM-dd hh:mm');

        for (int rowIndex = 0; rowIndex < dates.size(); rowIndex++) {
            Row row = sheet.getRow(rowIndex);

            if (row == null) {
                row = sheet.createRow(rowIndex);
            }

            Cell cell = row.createCell(0);
            cell.setCellValue(dates.get(rowIndex));
            CellStyle style = sheet.getWorkbook().createCellStyle();
            style.setDataFormat(sheet.getWorkbook().createDataFormat().getFormat('yyyy-MM-dd hh:mm'));
            cell.setCellStyle(style);
        }
    }
}

代码功能:

  • 读取名为 'input-2.xlsx' 的 Excel 文件。
  • 找到名为 'P1' 的工作表。
  • 复制 'P1' 工作表的单元格格式。
  • 读取 'P1' 工作表第一列的日期数据。
  • 在日期数据中插入中间日期,确保相邻日期间隔不超过 10 天。
  • 将处理后的日期数据写入名为 'P2' 的新工作表。
  • 将结果保存回 'input-2.xlsx' 文件。

代码优化:

  • 增加了注释,提高代码可读性。
  • 设置了插入日期数量阈值和计数器,避免潜在的死循环问题。
  • 在插入日期时,检查是否已存在相同日期,避免重复插入。
  • 使用格式化工具格式化日期数据,提高输出结果的可读性。

运行代码一直不结束的可能原因:

  • 死循环: 代码中可能存在无法跳出的循环,例如插入日期的循环条件设置不正确。
  • 资源未释放: 文件流等资源未正确关闭,导致程序无法正常结束。
  • 其他隐含问题: 代码中可能存在其他逻辑错误,导致程序无法按预期执行。

解决方法:

  • 检查循环条件,确保循环能够正常结束。
  • 确保所有资源都正确关闭。
  • 使用调试工具逐步执行代码,查找问题所在。
  • 添加日志输出,帮助定位问题。

希望以上信息能够帮助你解决问题! 如果还有其他问题,请随时提出。

Java实现Excel日期数据自动填充: 优化日期间隔

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

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