Я хочу иметь ComboBox со следующими записями:
{"0,5", "1", "1,5", "2", "2,5"}
Я использую DataValidation:
DataValidation dataValidation = null;
DataValidationConstraint constraint = null;
DataValidationHelper validationHelper = null;
validationHelper = new XSSFDataValidationHelper(sheet);
CellRangeAddressList addressList = new CellRangeAddressList(row, row, col, col);
constraint = validationHelper.createExplicitListConstraint(list);
dataValidation = validationHelper.createValidation(constraint, addressList);
dataValidation.setSuppressDropDownArrow(true);
sheet.addValidationData(dataValidation);
Список имеет следующую структуру:
список = новая строка [] { "0,5", "1", "1,5", "2", "2,5" }
Но после создания файла excel в раскрывающемся списке есть что-то еще.
0, 5, 1, 1, 5
Это почему?
Если я использую обозначение точки (0,5, 1, 1,5), следующая проблема заключается в том, что когда я выбираю из ComboBox, excel автоматически форматирует его до даты, например, 1,5 -> 01. Май
Ответ 1 · рейтинг 4 · Axel Richter
Из вашего описания кажется, что в вашем Excel десятичный разделитель - это запятая из ваших текущих настроек локали. Таким образом, эта запятая в {"0,5", "1", "1,5", "2", "2,5"} конфликтует с запятой, используемой в качестве разделителя списка в формуле ограничения списка. Это связано с тем, что эта формула ограничения списка будет <formula1>"0,5,1,1,5,2,2,5"</formula1>.
При использовании {"0.5", "1", "1.5", "2", "2.5"} формула ограничения списка будет <formula1>"0.5,1,1.5,2,2.5"</formula1>. Но теперь точка в этой формуле находится в конфликте с вашими языковыми настройками, имеющими запятую в качестве десятичного разделителя и точку в качестве разделителя в литералах даты.
Это хорошо известная Excel проблема. Текущие версии Excel решают эту проблему, используя другой вид хранения ограничения списка: <x12ac:list>"0,5",1,"1,5",2,"2,5"</x12ac:list> вместо: <formula1>"0,5,1,1,5,2,2,5"</formula1>. Но apache poi не поддерживает это.
В качестве обходного пути я предлагаю использовать скрытый лист для хранения элементов списка.
Пример:
import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.*;
class CreateExcelDataValidationListName {
public static void main(String[] args) throws Exception{
Workbook workbook = new XSSFWorkbook();
//create sheet for storing the list items:
Sheet sheet = workbook.createSheet("ListSheet");
sheet.createRow(0).createCell(0).setCellValue("SourceList");
int r = 1;
for (double d = 0.5; d < 3; d+=0.5) {
sheet.createRow(r++).createCell(0).setCellValue(d);
}
//unselect that sheet because we will hide it later
sheet.setSelected(false);
//create a named range for the list contraint
Name namedCell = workbook.createName();
namedCell.setNameName("SourceList");
String reference = "ListSheet!$A$2:$A$5";
namedCell.setRefersToFormula(reference);
//create the visible sheet
sheet = workbook.createSheet("Sheet1");
sheet.createRow(0).createCell(0).setCellValue("Take the ListItems from B1:");
sheet.setActiveCell(new CellAddress("B1"));
sheet.autoSizeColumn(0);
//create the data validation
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint("SourceList");
CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 1, 1);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
//hide the ListSheet
workbook.setSheetHidden(0, true);
//set Sheet1 active
workbook.setActiveSheet(1);
FileOutputStream out = new FileOutputStream("CreateExcelDataValidationList.xlsx");
workbook.write(out);
out.close();
workbook.close();
}
}