Java 通过apache poi复制粘贴excel中的数据时,数据验证失败

Java 通过apache poi复制粘贴excel中的数据时,数据验证失败,java,excel,apache,validation,Java,Excel,Apache,Validation,我正在使用ApachePOI制作一个.xls文件。我还包括一些数据验证,如图所示 ObservableList<String> objectstatusList = UpgradeWorkBench.wsData.getObjectStatusDevMan("Test", "testing"); String[] strStatus = new String[objectstatusList.size()]; objectstatusList.toArray(strStatus);

我正在使用ApachePOI制作一个.xls文件。我还包括一些数据验证,如图所示

ObservableList<String> objectstatusList = UpgradeWorkBench.wsData.getObjectStatusDevMan("Test", "testing");
String[] strStatus = new String[objectstatusList.size()];
objectstatusList.toArray(strStatus);

CellRangeAddressList addressListStatus = new CellRangeAddressList(0, 65535, 9, 9);
DVConstraint dvConstraintStatus = DVConstraint.createExplicitListConstraint(strStatus);
dataValidationStatus = new HSSFDataValidation(addressListStatus, dvConstraintStatus);
dataValidationStatus.setSuppressDropDownArrow(false);
dataValidationStatus.setErrorStyle(ErrorStyle.STOP);
observeListObjectStatusList=UpgradeWorkBench.wsData.getObjectStatusDevMan(“测试”、“测试”);
String[]strStatus=新字符串[objectstatusList.size()];
objectstatusList.toArray(strStatus);
CellRangeAddressList addressListStatus=新的CellRangeAddressList(0,65535,9,9);
DVConstraint dvConstraintStatus=DVConstraint.createExplicitListConstraint(strStatus);
dataValidationStatus=新的HSSFDataValidation(addressListStatus,dvConstraintStatus);
dataValidationStatus.setSuppressDropDownArrow(假);
dataValidationStatus.setErrorStyle(ErrorStyle.STOP);

如果我手动输入任何数据,验证将正确应用。但如果我从其他单元格复制粘贴数据,验证将失败,验证也将从该单元格中完全删除。任何人都可以帮助我如何验证数据,即使在复制粘贴


我看到了许多链接,但无法获得正确的解决方案,因为ApachePOI不能创建宏,唯一的方法是使用所需宏的模板并从该模板创建结果

例如:

使用工作表
Sheet1
和位于该工作表代码模块中的宏的
template.xls

编辑2020-09-03: 上面的链接现在已断开。但是你看。此处使用的名称是“DataValidationRange”,而不是“ValidationRange”。这是必须考虑的

然后可以使用以下代码:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import org.apache.poi.ss.usermodel.DataValidation.ErrorStyle;

import org.apache.poi.hssf.usermodel.*;

import java.io.*;

class ReadAndWriteFromTemplateWithMacro {

 public static void main(String[] args) {
  try {

   String templateName = "template.xls";
   String resultName = "result.xls";
 
   String sheetName = "Sheet1";
 
   String[] strStatus = new String[]{"on", "off", "maybe"};

   FileInputStream template = new FileInputStream(templateName);
   Workbook wb = WorkbookFactory.create(template);   
   Sheet sheet = wb.getSheet(sheetName);

   if (sheet instanceof HSSFSheet) {

    CellRangeAddressList addressListStatus = new CellRangeAddressList(0, 65535, 9, 9);  
    DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(strStatus);
    DataValidation dataValidation = new HSSFDataValidation(addressListStatus, dvConstraint);
    dataValidation.setSuppressDropDownArrow(false);
    dataValidation.setErrorStyle(ErrorStyle.STOP);

    sheet.addValidationData(dataValidation);

    //create a named range for the data validation as described in http://spreadsheetpage.com/index.php/tip/ensuring_that_data_validation_is_not_deleted/
    Name name =  wb.createName();
    name.setNameName("ValidationRange");
    String reference = addressListStatus.getCellRangeAddress(0).formatAsString(sheetName, true);
    name.setRefersToFormula(reference);

   }

   FileOutputStream output = new FileOutputStream(resultName);
   wb.write(output);
   wb.close();

  } catch (InvalidFormatException ifex) {
  } catch (FileNotFoundException fnfex) {
  } catch (IOException ioex) {
  }
 }
}

现在,
result.xls
也将包含该宏。如果启用了宏,则此宏将通过粘贴防止销毁数据验证。

“但是如果我从其他单元格复制粘贴数据,验证将失败,验证也将从该单元格中完全删除。”这不依赖于apache poi。本机Excel也会出现同样的情况。看,我只能用java控制excel。我该怎么做呢?因为ApachePOI不能创建宏,所以不能直接创建宏。请看我的答案。你说的“将宏放入代码模块”是什么意思???宏应放在何处?例如,可以在VBA编辑器中找到工作表代码模块,如下所述()。转到图纸模块的另一种方法是右键单击图纸选项卡并选择“查看代码”。