Java 通过apache poi复制粘贴excel中的数据时,数据验证失败
我正在使用ApachePOI制作一个.xls文件。我还包括一些数据验证,如图所示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);
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编辑器中找到工作表代码模块,如下所述()。转到图纸模块的另一种方法是右键单击图纸选项卡并选择“查看代码”。