痔になりやすい生活習慣とは?

以下のような処理を検討しています。

フォーマット.xlsには、タイトル行の雛型(背景色などを定義済)をを作成しておきます。

そのフォーマット.xlsをpoiを利用し読み込み、
■タイトル行
・明細
・明細
・明細
■タイトル行
・明細
・明細
の要領でタイトル行を何度もコピーし、新しいエクセルを出力したいと考えています。
HSSFSheet#shiftRowsは完全なる移動のようですので、
何度もタイトル行を使う場合には不都合がでてしまいます。

単純な行コピーなのでできそうな感じもするのですが、
ご存じな方いらっしゃいましたら、
ご教授いただけますようお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

コピーのようなメソッドは用意されていないんですね。


ちょっと面倒ですが、行の内容を取得して、その中のセルの値およびスタイルをコピーするという方法でしたらどうでしょうか。

  // テンプレートの読み込み
  POIFSFileSystem fs = new POIFSFileSystem(
      new FileInputStream(new File("src.xls")));
  HSSFWorkbook book = new HSSFWorkbook(fs);
  HSSFSheet sheet = book.getSheetAt(0);
  
  // タイトル行(1行目)の取得
  HSSFRow titleRow = sheet.getRow(0);
  
  // タイトル行を別の行(ここでは2行目)へコピーします。
  HSSFRow row = sheet.createRow(1);
  
  // セルをコピーします。
  int length = titleRow.getLastCellNum();
  for (int i=0; i<length; i++) {
    HSSFCell titleCell = titleRow.getCell((short)i);
    HSSFCell cell = row.createCell((short)i);
    if (titleCell != null) {
      // 値を取得
      switch (titleCell.getCellType()) {
        case HSSFCell.CELL_TYPE_BLANK :
          break;
        case HSSFCell.CELL_TYPE_BOOLEAN :
          cell.setCellValue(titleCell.getBooleanCellValue());
          break;
        case HSSFCell.CELL_TYPE_ERROR :
          cell.setCellValue(titleCell.getErrorCellValue());
          break;
        case HSSFCell.CELL_TYPE_FORMULA :
          cell.setCellValue(titleCell.getStringCellValue());
          break;
        case HSSFCell.CELL_TYPE_NUMERIC :
          cell.setCellValue(titleCell.getNumericCellValue());
          break;
        case HSSFCell.CELL_TYPE_STRING :
          cell.setCellValue(titleCell.getStringCellValue());
          break;
        default :
      }
      // スタイルを取得
      cell.setCellStyle(titleCell.getCellStyle());
    }
  }
  
  // 保存
  FileOutputStream fos = new FileOutputStream(new File("dest.xls"));
  book.write(fos);
  fos.close();

※例外処理は抜いています。
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXECLの行を削除

こんにちは
質問があります。
以下のコードのように、
テキストボックスに入力した行数の
エクセルの行を削除したいのですが、
何も削除されません。
どなたか解決策を教えていただけないでしょうか
よろしくお願いいたします。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

class testdel
{
public static void main(String[] args)
{
testdel2 test=new testdel2();
}
}

class testdel2 implements ActionListener
{
JButton button;
JTextField text;

testdel2()
{
JFrame frame=new JFrame();
JPanel panel=new JPanel();
button=new JButton("削除");
text=new JTextField(1);

button.addActionListener(this);
panel.add(text);
panel.add(button);

Container ct=frame.getContentPane();
ct.add(panel);

frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button)
{
int del_row=Integer.parseInt(text.getText());
Delete del=new Delete(del_row);
}
}
}
class Delete
{
Delete(int delrow)
{
try
{System.out.println(delrow);
FileInputStream fis = new FileInputStream("c:/sample.xls");
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb1 = new HSSFWorkbook(fs);
HSSFSheet sheet = wb1.getSheetAt(0);
HSSFRow row=sheet.getRow(delrow);

sheet.removeRow(row);
System.exit(0);
}
catch(Exception e)
{
System.err.println(e.toString());
}
}
}

こんにちは
質問があります。
以下のコードのように、
テキストボックスに入力した行数の
エクセルの行を削除したいのですが、
何も削除されません。
どなたか解決策を教えていただけないでしょうか
よろしくお願いいたします。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

class testdel
{
public static void main(Strin...続きを読む

Aベストアンサー

removeRowではなくshiftRowsを使用すると
削除したように見せることができます。

sheet.removeRow(row);

sheet.shiftRows(delrow,sheet.getLastRowNum(),-1);

QPOIを使った書式設定

度々、POIを使ったExcel出力で質問です
書式設定で通貨記号ありのフォーマットを指定したいのですが

Excelに「\」記号で書式設定した後に
POIで書式を取得したところ
($#,##_):($#,##) ←うろ覚えです(汗
の形式で取得できました

同じように、他のセルに対してPOIで設定したところ
通貨記号が「$」で表示されてしまいました

Excelの書式設定画面を見ると、
 使用する通貨記号の設定
だけ、別で指定するようになっています。

POIで通貨記号を設定する方法を教えてください。

Aベストアンサー

こんな感じでしょうか。

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFDataFormat dataFormat = workbook.createDataFormat();
short index = dataFormat.getFormat("\"\\\"#,##0_);[Red](\"\\\"#,##0)");
HSSFCellStyle style = workbook.createCellStyle();
style.setDataFormat(index);
HSSFSheet sheet = workbook.createSheet();
HSSFCell cell = sheet.createRow(0).createCell((short)0);
cell.setCellStyle(style);

参考URL:http://www.javadrive.jp/poi/style/index9.html

QJakarta POI での、excelのシート保護

こんにちは。いつも色々と参考にさせていただいております。POIを利用して、excelのシートの操作をやっているのですが、シートの保護がうまくいきません。

まず、sample.xlsを読み込み、

FileInputStream is = new FileInputStream("sample.xls");
HSSFWorkbook book = new HSSFWorkbook(is);
HSSFSheet sheet = book.getSheetAt(0);

HSSFSheetクラスのsetProtectメソッドを用いて、

sheet.setProtect(false);

とすると、NullPointerExceptionが発生してしまいます。

メソッドの使い方が間違っているのでしょうか?
どなたかご存知でしたらご教授いただきたいと思います。
よろしくお願い致します。

Aベストアンサー

こんにちは

POIのソースを探ってみました。
ワークブック(HSSFWorkbook)から、すでに存在するシートを取得して(getSheetAtメソッド)、そのシートに対して、プロテクトの設定する。
→NullPointerException

ワークブック(HSSFWorkbook)から、新規にシートを作成・取得して(createSheetメソッド)、そのシートに対して、プロテクトの設定する。
→例外なく通過=成功

と言う結果になりました。
HSSFSeetクラスには、Sheetクラスがフィールド(メンバー変数)としてあって、Sheetクラスには、ProtectRecordクラスがフィールドとしてあります。
どうやら、createSheetメソッドで、HSSFSeetクラス・オブジェクトを生成すると、ProtectRecordクラス・オブジェクトも生成されますが、
getSheetAtメソッドでHSSFSeetクラス・オブジェクトを取得しても、ProtectRecordクラス・オブジェクトが生成されません。

これがPOIの仕様なのか、バグなのかわかりませんが、原因は、このメソッドによる動作差異によるようです。

こんにちは

POIのソースを探ってみました。
ワークブック(HSSFWorkbook)から、すでに存在するシートを取得して(getSheetAtメソッド)、そのシートに対して、プロテクトの設定する。
→NullPointerException

ワークブック(HSSFWorkbook)から、新規にシートを作成・取得して(createSheetメソッド)、そのシートに対して、プロテクトの設定する。
→例外なく通過=成功

と言う結果になりました。
HSSFSeetクラスには、Sheetクラスがフィールド(メンバー変数)としてあって、Sheetクラスには、Prote...続きを読む

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

Q【Apache POI】Excelの枠線を消す方法

いつもお世話になっております。

Apache POIを使用して、シート全体の範囲でExcelシートの枠線を消す方法を教えてください。
セルひとつひとつに書式を設定するのではなく、全体で設定したいです。
ちなみに環境は以下を使用しています。

情報に不足があればお問い合わせください。よろしくお願いします。

【環境】
Excel : 2002 SP3
java : 6.0

Aベストアンサー

POIのバージョンは何でしょうか?
多分、バージョンによらず一発で設定できるようなメソッドは多分ないと思いますが。
行ごと列ごとなどの単位で、一つ一つ設定するしかないと思います。

「枠線」ではなくて「罫線」ですよね?
「枠線」なら、
sheet.setDisplayGridlines(false);
とすれば表示されなくなります。
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Sheet.html#setDisplayGridlines(boolean)

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q文字列を日付に変換でParseException

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(8,10);
sgndate = DateFormat.getDateInstance().parse(lstdaysgn); ・・・・・・・・・ここでエラー発生
}

どこが悪いのか解りません。
よろしくご教授ください。

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(...続きを読む

Aベストアンサー

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろん後続のルーチンでnullチェックは要るようになる。
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
// ↓これもしない。
// lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
//                              lstdaysgn.substring(8,10);
sgndate = new SimpleDateFormat("yyyyMMdd").parse(lstdaysgn); // スラッシュつけずに8桁のyyyyMMddでそのままDateにする。
}

以上の手直しにより、このルーチンを通る際にDate 1つとString 7つ、インスタンスの生成を回避する事ができる。これがループで処理されるならなおさら。
仮に、「new SimpleDateFormat("yyyyMMdd")だとパースのたびにSimpleDateFormatのインスタンスが作られちゃうジャン!」と思うならルーチン化していいと思うけど、その場合はスレッドセーフなルーチンにしないといけないのでそこらへん注意の事。

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろ...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QArrayListを使った多次元配列の作成について

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
-----------------------------------------
上記から下記のように変更しました。
-----------------------------------------
ArrayList[] cars=new ArrayList[3];
cars[0].add("フェラーリ");
cars[0].add("ポルシェ");
cars[0].add("メルセデスベンツ");
for(int i=0;i<cars[0].size();i++){
 String str=(String)cars[0].get(i);
 System.out.println(str);}
-----------------------------------------
エラーは「Exception in thread "main" java.lang.NullPointerException」です。
どうやら初期配列が10ではなく3となってしまっているようです。

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
---------------------------------------...続きを読む

Aベストアンサー

こんにちは。

>ArrayList[] cars=new ArrayList[3];
はArrayList型のオブジェクトのインスタンス
を格納する箱を3個作成しただけなので、
この時点では、
cars[0] = null
cars[1] = null
cars[2] = null
となっています。ですから、当然
cars[0].add("フェラーリ");
などとやると、NullPointerExceptionが
発生します。これをさけるには、
cars[0] = new ArrayList();
cars[1] = new ArrayList();
cars[2] = new ArrayList();
とする必要があります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング