どのように読んだ数値の文字列をExcel細胞の文字列としてなす。

StackOverflow https://stackoverflow.com/questions/1072561

  •  21-08-2019
  •  | 
  •  

質問

  1. 私は、excelファイルのような内容:

    • A1:SomeString

    • A2:2

    すべての分野に設定した文字列形式です。

  2. 私はファイルの読み込みjavaの使用の施設で、そA2は数値細胞形式です。

  3. 問題は、その価値A2き2や2.0(こういうことができるようにそれらを区別できなだけ利用 .toString().

どうすりゃいいの値を読み込む文字列として?

役に立ちましたか?

解決

私は同じ問題を抱えていました。私は関係なく、ユーザーがセルの書式設定する方法の問題を解決した文字列の値を、読む前にcell.setCellType(Cell.CELL_TYPE_STRING);をしました。

他のヒント

と思いましたこのクラスが使い方に質問ですが、今日はあります。

やりたいでの利用 DataFormatterクラス.渡ししますこの細胞ではそのベストを返す文字列を含む何Excelのようなおもてなし。合格で文字列細胞からの文字列です。合格で数値細胞のフォーマット規則が適用されてい形式の数について定めており、これに基づまの文字列です。

お場合、その数値の細胞の"整数値フォーマット規則を適用します。だDataFormatterフォーマットにその細胞できる文字列の整数文字列です。

また、多くの人がこう cell.setCellType(Cell.CELL_TYPE_STRING), ものの、 Apacheの施設JavaDocsかなり明確にできないこ!を行ってい setCellType 呼び出しでゆったりのフォーマットとして javadocs説明 唯一の方法で変換し文字列フォーマットと残りの利用 DataFormatterクラス.

以下のコードは、任意のタイプの細胞のために私のために働いています。

InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);

Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();

while(objIterator.hasNext()){

    Row row = objIterator.next();
    Cell cellValue = row.getCell(0);
    objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
    String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);

}
セルの種類を変更することは望ましくないとき

私は、次のアプローチをお勧めします:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverterが正しく精度の損失なしでExcelのルールを使用してテキストにdouble値に変換することができます。

すでに(ポイのJavaDocsの中で述べたように、<のhref = "https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29" のrel = "noreferrer"> https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 の)を使用しないでください。

cell.setCellType(Cell.CELL_TYPE_STRING);

が、使用ます:

DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);

http://massapi.com/class/da/DataFormatter.html

はい、これは完璧に動作します。

をお勧めます:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

古います:

cell.setCellType(Cell.CELL_TYPE_STRING);

あなたはcellは、式を有するから値を取得すると問題が発生した場合でも、まだこれは動作します。

試します:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

正しく番号をフォーマットする必要があります。

どの細胞ではテキスト形式の前にユーザーの種類、数の施設できるを得ることが出来ますので、価値を文字列として返します。一つの鍵が定めがある場合には、それにより小さな緑色の三角の左上のセルのフォーマットをしていることができます検索の値を文字列として(グリーンの三角形が表示されずるものが多くが惹テキスト形式)になります。場合はテキスト形式の細胞が含まれる数字が、施設な取得ている場合は、それらの数値を文字列としては、いくつかいスプレッドシートのデータによる:

  • セル上でダブルクリックして、その編集にカーソルが細胞内をクリックし入れができる唯一の細胞です。
  • 利用のExcel2007年にテキスト変換機能をできるだけ複数の細胞を一度に
  • 切り出し、加害値を別の場所を整形スプレッドシートの細胞において、テキスト、そしてrepasteの切り出した値として 打ち入力にな価値 の正します。

最後のものができないとすることをご使用の場合は施設の取得データから、Excel2007年表計算シートを使用する細胞クラス'getRawValue()'方法です。ここにはこだわらないという形式です。まだ文字列を返しのデータを収集します。

また、MS Excelの数値はセル値をApacheの施設図書館で読んでみたい数値として.だいたいので読むとして文字列(例:電話番号等)。こうして"とか"また戻ってしまった:

  1. 挿入の新しい列の最初の細胞=CONCATENATE("!",D2).思D2はセルidの電話番号ます。ドラッグ新しい細胞までです。

  2. 現場をご覧になりました細胞を利用施設での読み込み式での計算値です。い:

  3. 別の列の追加

  4. 選択が完全カラムで作成したステップ1です。を選択編集→コピー

  5. このページのトップへ戻る細胞のカラムで作成したステップ3.を選んで編集->貼り付け特

  6. のウィンドウを選択し"価値"のラジオボタン

  7. を選択し"OK"

  8. 現在の読み込みPOI API...読みになります。だけを取り外しの最初の文字につ"!"

また、同様の問題のデータセットの番号となったと見られるかどうかの課題である。私には言えない挿入される前に番号で別々のDBを輸入常は、数テキストで与えます。この8が輸入して8.0.

【解決

  • すべてのフォーマットとして一般的です。
  • こうして私を想定し番号保管中のA列から行1.
  • 入れの列Bにコピーして多く行しています。何も表示されるワークシートもセルをクリックし、ご覧のapostophe式バーがあります。
  • カラムC=B1&A1.
  • すべて選択、セルのカラムCといペースト特別入列はDの値を用いオプションです。

こんにちはさきがけの数が格納されています。

セルタイプが数値である場合は、

getStringCellValueはNumberFormatExceptionが返されます。あなたは、文字列への細胞の種類を変更したくない場合は、これを行うことができます。

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}

これらの答えの多くは、古いPOIのドキュメントやクラスを参照します。最新でPOI 3.16、 廃止されました。

Cell.CELL_TYPE_STRING

" ここに画像の説明を入力する

の代わりに CellType列挙するすることができます使用すること。

CellType.STRING 

ただ、そうでなければ、例外を取得していきますポイ依存性だけでなく、新しい3.16バージョンにPOI-OOXML依存してあなたのポンポンを更新してください。このバージョンでの一つの利点は、あなたが以前の回答に記載されているすべての余分なステップを排除するセルが作成された時点で細胞型を指定することができるということです。

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);

思うにルートの異なる答えはVinayak Dornala、残念ながらその影響は、自分のパフォーマンスです。はん HACKY 溶液の暗黙の鋳造:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

いることをお勧めしたい私の状況にうまくいったので、自然をどのようにシステムは、私は信頼のファイルのソースです。

脚注:numericColumn ではintを形成したものからの読み込みヘッダファイルのファイルが処理されます。

public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
    String retVal=null;
    try {
        FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
        Workbook wb=WorkbookFactory.create(fis);
        Sheet s=wb.getSheet(sheetname);
        Row r=s.getRow(rownum);
        Cell c=r.getCell(cellnum);
        if(c.getCellType() == Cell.CELL_TYPE_STRING)
        retVal=c.getStringCellValue();
        else {
            retVal = String.valueOf(c.getNumericCellValue());
        }

私はこれを試してみましたが、それは

私のために働きました

私たちは、同じ問題を抱えていたとの の値を入力する前に、「テキスト」としてセルの書式を設定するために、当社のユーザーを余儀なくされました。そのようにExcelが正しくテキストとして偶数を格納します。 フォーマットはExcelの値だけが表示される方法を変更するが、(例えば、細胞内のリターンを押すことによって)値が再び入力されない限り、値が格納されている方法を変更しない後で変更された場合。

テキストは、それがセルに数値が含まれますが、テキストとしてフォーマットされているセルの左上隅にあるExcelのディスプレイを考えれば小さな緑の三角形で示されているようにExcelが正常に値を保存するかどうか。

あなたはとにかくでExcelワークシートを制御するのですか?あなたの入力を与えるため、ユーザーが持っているテンプレートはありますか?もしそうなら、あなたはあなたのためのコードフォーマットに入力セルを持つことができます。

:これは、このバグ事実に基づいて、POIの現在のバージョンで行うことができないように

に見えます

https://issues.apache.org/bugzilla/show_bug.cgi? ID = 46136

まだ未解決である。

cell.setCellType(Cell.CELL_TYPE_STRING)。

私のために正常に動作しています

int型へのキャストは、.toString()を行います。それは醜いですが、それは動作します。

これは私のために完璧に働いています。

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top