2016-04-12 12 views
0

apache poiを使用して1つの.xlsファイルを作成しています。私は示されているようにいくつかのデータバリデーションを含んでいます。apache poiでExcelの貼り付けデータをコピーするとデータの検証に失敗する

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); 

データを手動で入力すると、検証が正しく適用されます。しかし、他のいくつかのセルからペーストデータをコピーすると、検証が失敗し、検証もそのセルから完全に削除されます。誰でもコピーペーストでもデータを検証する方法を教えてください。

私は多くのリンクを見ましたが、apache poiは、マクロを作成することはできませんので、唯一の方法は、必要なマクロとそのテンプレートからの結果を作成してテンプレートを持つことである正解

+0

"他のセルからデータをコピーしてコピーすると、検証が失敗し、検証もそのセルから完全に削除されます。"これはapache poiに依存しません。ネイティブエクセルでも同じことが起こります。 http://spreadsheetpage.com/index.php/tip/ensuring_that_data_validation_is_not_deleted/を参照してください。 –

+0

私はjavaだけを使用してExcelを制御する必要があります。どうやってやるの? –

+0

'apache poi'はマクロを作成できないので、これを直接行うことはできません。私の答えを見てください。 –

答えて

0

を得るcouldntの。

例:

ワークシートSheet1、そのワークシートのコードモジュールに配置http://spreadsheetpage.com/index.php/tip/ensuring_that_data_validation_is_not_deleted/からマクロでtemplate.xlsを持っ。 result.xlsもそのマクロが含まれています今

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) { 
    } 
} 
} 

その後、次のコードを使用することができます。マクロが有効な場合、このマクロは貼り付けることでデータの破壊を防ぎます。

+0

「マクロをコードモジュールに入れる」とはどういう意味ですか?マクロはどこに置くべきですか? –

+0

ワークシートコードモジュールは、ここで説明するVBAエディタ(http://www.rondebruin.nl/win/code.htm)にあります。シートモジュールに行く別の方法は、シートタブを右クリックして "コードを見る"を選択することです。 –

関連する問題