Apache POIを使用してExcelワークブック間でセルをコピーする

寄付:

最新バージョンのApache POI(4.1.2)を使用して、あるブックから別のブックにセルをコピーしようとしています。

両方のブックが.xlsxファイルの場合、すべてが正常に動作します。ただし、ソースブックが(古い).xlsファイルで、宛先ワークブックが.xlsxファイルの場合、次のコードは失敗します

// Copy style from old cell and apply to new cell
CellStyle newCellStyle = targetWorkbook.createCellStyle();
newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
targetCell.setCellStyle(newCellStyle);

スローされる例外は次のとおりです。

java.lang.IllegalArgumentException:HSSFCellStyleとXSSFCellStyleの間ではなく、1つのXSSFCellStyleから別のXSSFCellStyleにのみ複製できます

cloneStyleFromファイル(またはWorkbookオブジェクト)のタイプが異なる場合に使用できない場合HSSFCellStyleオブジェクトをどのように変換できXSSFCellStyleますか?

アクセルリヒター:

あなたの質問への回答「HSSFCellStyleオブジェクトをどのように変換できXSSFCellStyleますか?」です:を使用してそれを行うことはできませんapache poi 4.1.2CellStyle.cloneStyleFromに明記されているように、これは単にサポートされていません: "ただし、両方のCellStylesは同じタイプ(HSSFCellStyleまたはXSSFCellStyle)である必要があります。"

もう1つの質問は、あるセルスタイルを別のセルスタイルに変換する必要があるかどうかです。または、どのようなユースケースがありCellStyle.cloneStyleFromますか?私の意見ではありません。Excel一意のセル形式/セルスタイルの数に制限があります。Excelの仕様と制限をご覧くださいしたがって、これらの制限に非常に早く到達するため、各単一セルに対して単一セルスタイルを作成しないでください。したがって、セルスタイルを複製する代わりに、ソーススタイルからスタイルプロパティを取得し、CellUtil.setCellStylePropertiesstyle1使用して、それらのスタイルプロパティを問題の他のセルに設定する必要がありますこのメソッドは、セルの現在のスタイルとスタイルプロパティに一致する既存のものを見つけようとしますCellStylepropertiesブックに一致するスタイルが含まれていない場合にのみ、新しいスタイルが作成されます。

質問のタイトルは「Apache POIを使用してExcelワークブック間でセルをコピーする」であるため、これを行う方法の草案を作成しました。

次のコードは、最初に存在Workbook.xls取得しHSSFWorkbook wb1、新しいを作成しXSSFWorkbook wb2ます。次に、の最初のシートのすべてのセルをループし、wb1それらのセルをの最初のシートにコピーしようとしwb2ます。これを行うには、copyCells(Cell cell1, Cell cell2)を使用する方法がありますcopyStyles(Cell cell1, Cell cell2)後者は、取得したソーススタイルからスタイルプロパティをstyle1取得しcell1CellUtil.setCellStylePropertiesそれらを使用してそれらのスタイルプロパティをに設定しcell2ます。フォントをコピーするためにcopyFont(Font font1, Workbook wb2)使用されます。これはwb2、そのようなフォントがそのワークブックにまだ存在しない場合のみ、新しいフォントを作成しようとしますのワークブックごとに固有のフォントタイプの制限もあるため、これが必要Excelです。

作業例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellUtil;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import java.util.*;

class ExcelCopyCells {

 static Font copyFont(Font font1, Workbook wb2) {
  boolean isBold = font1.getBold();
  short color = font1.getColor();
  short fontHeight = font1.getFontHeight();
  String fontName = font1.getFontName();
  boolean isItalic = font1.getItalic();
  boolean isStrikeout = font1.getStrikeout();
  short typeOffset = font1.getTypeOffset();
  byte underline = font1.getUnderline();

  Font font2 = wb2.findFont(isBold, color, fontHeight, fontName, isItalic, isStrikeout, typeOffset, underline);
  if (font2 == null) {
   font2 = wb2.createFont();
   font2.setBold(isBold);
   font2.setColor(color);
   font2.setFontHeight(fontHeight);
   font2.setFontName(fontName);
   font2.setItalic(isItalic);
   font2.setStrikeout(isStrikeout);
   font2.setTypeOffset(typeOffset);
   font2.setUnderline(underline);
  }

  return font2;
 }

 static void copyStyles(Cell cell1, Cell cell2) {
  CellStyle style1 = cell1.getCellStyle();
  Map<String, Object> properties = new HashMap<String, Object>();

  //CellUtil.DATA_FORMAT
  short dataFormat1 = style1.getDataFormat();
  if (BuiltinFormats.getBuiltinFormat(dataFormat1) == null) {
   String formatString1 = style1.getDataFormatString();
   DataFormat format2 = cell2.getSheet().getWorkbook().createDataFormat();
   dataFormat1 = format2.getFormat(formatString1);
  }
  properties.put(CellUtil.DATA_FORMAT, dataFormat1);

  //CellUtil.FILL_PATTERN  
  //CellUtil.FILL_FOREGROUND_COLOR 
  FillPatternType fillPattern = style1.getFillPattern();
  short fillForegroundColor = style1.getFillForegroundColor(); //gets only indexed colors, no custom HSSF or XSSF colors
  properties.put(CellUtil.FILL_PATTERN, fillPattern);
  properties.put(CellUtil.FILL_FOREGROUND_COLOR, fillForegroundColor);

  //CellUtil.FONT
  Font font1 = cell1.getSheet().getWorkbook().getFontAt(style1.getFontIndexAsInt());
  Font font2 = copyFont(font1, cell2.getSheet().getWorkbook());
  properties.put(CellUtil.FONT, font2.getIndexAsInt());

  //BORDERS
  BorderStyle borderStyle = null;
  short borderColor = -1;
  //CellUtil.BORDER_LEFT 
  //CellUtil.LEFT_BORDER_COLOR
  borderStyle = style1.getBorderLeft();
  properties.put(CellUtil.BORDER_LEFT, borderStyle);
  borderColor = style1.getLeftBorderColor();
  properties.put(CellUtil.LEFT_BORDER_COLOR, borderColor);
  //CellUtil.BORDER_RIGHT 
  //CellUtil.RIGHT_BORDER_COLOR
  borderStyle = style1.getBorderRight();
  properties.put(CellUtil.BORDER_RIGHT, borderStyle);
  borderColor = style1.getRightBorderColor();
  properties.put(CellUtil.RIGHT_BORDER_COLOR, borderColor);
  //CellUtil.BORDER_TOP 
  //CellUtil.TOP_BORDER_COLOR
  borderStyle = style1.getBorderTop();
  properties.put(CellUtil.BORDER_TOP, borderStyle);
  borderColor = style1.getTopBorderColor();
  properties.put(CellUtil.TOP_BORDER_COLOR, borderColor);
  //CellUtil.BORDER_BOTTOM 
  //CellUtil.BOTTOM_BORDER_COLOR
  borderStyle = style1.getBorderBottom();
  properties.put(CellUtil.BORDER_BOTTOM, borderStyle);
  borderColor = style1.getBottomBorderColor();
  properties.put(CellUtil.BOTTOM_BORDER_COLOR, borderColor);

  CellUtil.setCellStyleProperties(cell2, properties);
 }

 static void copyCells(Cell cell1, Cell cell2) {
  switch (cell1.getCellType()) {
   case STRING:
   /*
    //TODO: copy HSSFRichTextString to XSSFRichTextString 
    RichTextString rtString1 = cell1.getRichStringCellValue();
    cell2.setCellValue(rtString1); // this fails if cell2 is XSSF and rtString1 is HSSF
   */
    String string1 = cell1.getStringCellValue();
    cell2.setCellValue(string1);
   break;
   case NUMERIC:
    if (DateUtil.isCellDateFormatted(cell1)) {
     Date date1 = cell1.getDateCellValue();
     cell2.setCellValue(date1);
    } else {
     double cellValue1 = cell1.getNumericCellValue();
     cell2.setCellValue(cellValue1);
    }
   break;
   case FORMULA:
    String formula1 = cell1.getCellFormula();
    cell2.setCellFormula(formula1);
   break;

   //case : //TODO: further cell types

  }

  copyStyles(cell1, cell2);

 }

 public static void main(String[] args) throws Exception {
  Workbook wb1 = WorkbookFactory.create(new FileInputStream("Workbook.xls"));
  Workbook wb2 = new XSSFWorkbook();

  Sheet sheet1 = wb1.getSheetAt(0);
  Sheet sheet2 = wb2.createSheet();

  Set<Integer> columns = new HashSet<Integer>();
  Row row2 = null;
  Cell cell2 = null;
  for (Row row1 : sheet1) {
   row2 = sheet2.createRow(row1.getRowNum());
   for (Cell cell1 : row1) {
    columns.add(cell1.getColumnIndex());
    cell2 = row2.createCell(cell1.getColumnIndex());
    copyCells(cell1, cell2);
   }
  }

  wb1.close();

  for (Integer column : columns) {
   sheet2.autoSizeColumn(column);
  }

  FileOutputStream out = new FileOutputStream("Workbook.xlsx");
  wb2.write(out);
  out.close();
  wb2.close();
 }
}

このWorkbook.xlsような場合

ここに画像の説明を入力してください

結果Workbook.xlsxは次のようになります。

ここに画像の説明を入力してください

注:これは作業草案であり、完了する必要があります。TODOコード内のコメントを参照してくださいRichTextStringセル値を考慮する必要があります。さらなる細胞型を考慮する必要があります。

このメソッドcopyStylesは、データ形式、塗りつぶしパターン、塗りつぶしの前景色(インデックス付きカラーの場合のみ)、フォント、および境界線のみを提供します。さらにセルスタイルプロパティを考慮する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

ApacheのJavaのPOIを使用してExcelミリ秒でテーブルを挿入する方法

Apache POIを使用して特定のExcelワークシートのすべての境界線を削除する

Apache POIを使用してExcelでピボットテーブルを作成する方法はありますか?

SpringでApache POIを使用してExcelのマージセルを読む

塗りつぶし色Apache POI Excelワークブックを設定できません

JavaでApache poiを使用して単語のテーブルの寸法と間隔を設定する方法

Apache POIを使用してExcelでセルを結合する

Apache Poiを使用してExcelシートからセル値を取得する

Apache POIを使用してExcelの単一列をロックする

Apache POIを使用してパスワードで保護されたExcelファイルを作成しますか?

apache poiは、異なるワークブックに1つのスタイルを適用します

Apache POIを使用してExcelシートをコピーする

Apache Poiでワークシートのタブの色を変更する方法

JavaでApache POIを使用してドキュメント間ハイパーリンクを生成する

Apache POIを使用してExcelに書き込みます。FileNotFoundException:(要求された操作は、ユーザーがマップしたセクションが開いているファイルでは実行できません)

Excelブックに透かしを追加するApache POI

Java(Selenium)セットアップでApache POIを使用して、複数のスレッド(並列テストケース)が同じExcelファイルに同時にアクセスするにはどうすればよいですか?

Apache POIを使用して、列ラベルをピボットテーブルに挿入しますか?

プログラムがExcelワークブック(Apache POI)の読み取りを停止します

新しいセルを作成し、Apache POIで前のセルのスタイルをコピーします。

Apache POIを使用してExcelファイルを読み取る前に、ワークブックを作成する必要があるのはなぜですか?

Apache POI APIを使用してExcelセルがロックされているかどうかをどのように確認できますか?

Apache POI 3.9でピボットテーブルのクローンを作成しますか?

apache POIとPrimeFacesを使用して、既存のExcelワークブックに新しいシートを追加する方法

Apache POIでワークブックとシートクラスを使用しますか?

WSLでApache24(Win環境)を使用してWindowsでローカルネットワークリポジトリをセットアップする方法

Apache POI を使用して Excel から通貨コードを取得する方法は?

ワークブックでワークシートを反復する方法 - Scala - spoiwo/poi.apache.org

Apache POIフレームワークはいつExcelセルを空でnullと見なしますか?

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    PictureBoxで画像のブレンドを無効にする

  3. 3

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  4. 4

    テキストフィールドの値に基づいて UIslider を移動します

  5. 5

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  6. 6

    追加後、ブートストラップマルチセレクトがテーブルで機能しない

  7. 7

    MyBatisがネストされたオブジェクト属性を参照するとOgnlExceptionが発生します

  8. 8

    Ansibleで複数行のシェルスクリプトを実行する方法

  9. 9

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  10. 10

    Python / SciPyのピーク検出アルゴリズム

  11. 11

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  12. 12

    「埋め込みブラウザのOAuthログイン」を有効にしてコールバックURLを指定した後でも、Facebookのコールバックエラーが発生する

  13. 13

    Dynamics365からローカルファイルにアクセスできます。ローカルリソースは許可されていません

  14. 14

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  15. 15

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  16. 16

    Chromeウェブアプリのウェブビューの高さの問題

  17. 17

    ZScalerと証明書の問題により、Dockerを使用できません

  18. 18

    C ++でのcURLとマルチスレッドの使用

  19. 19

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  20. 20

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  21. 21

    java.lang.NoClassDefFoundError:com / sun / istack / tools / DefaultAuthenticator $ Receiver

ホットタグ

アーカイブ