質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

21681閲覧

JavaでのExcel出力について教えてください。

syncrock

総合スコア209

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/11/11 02:50

用意したExcelのテンプレートに値を出力したいと思っております。
一般的には(?)poiの使用があるかと思いますが、
SXSSFではテンプレートを読み込み、そこに出力。ということは可能でしょうか。
WriteOnlyだったと思っていますが、それは値を取得が無理っていうわけではなく、
そもそもExcelファイル自体取得が無理なのでしょうか。
HSSFやXSSFはメモリ展開ですので、リソース消費が激しく使えないので。。。

他に低メモリでテンプレートへの出力が可能なAPIや実装方式などあれば教えて頂けますでしょうか。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

既存のエクセルをテンプレートとしてSXSSFWorkbookを作ることは可能でしたが、既存の行に値を盛り込むのは無理なようです。
データを追加することは可能ですが、シートのコピーもできないようなので、なかなか困った感じですね…。

java

1import java.io.File; 2import java.io.FileOutputStream; 3import java.io.IOException; 4import java.io.InputStream; 5import java.io.OutputStream; 6 7import org.apache.poi.xssf.streaming.SXSSFSheet; 8import org.apache.poi.xssf.streaming.SXSSFWorkbook; 9import org.apache.poi.xssf.usermodel.XSSFWorkbook; 10 11public class PoiSample { 12 public void loadAndSave() throws IOException { 13 14 InputStream inp = Thread.currentThread().getClass().getResourceAsStream("/template.xlsx"); 15 // 読み込み対象のワークブック 16 XSSFWorkbook loadbook = new XSSFWorkbook(inp); 17 18 // Streaming XSSF Workbookから読み込む 19 SXSSFWorkbook book = new SXSSFWorkbook(loadbook); 20 21 SXSSFSheet sheet = book.getSheetAt(0); 22 23 // たとえば30行目まで値があった場合は次のようにする 24 sheet.createRow(31).createCell(0).setCellValue("12345678"); 25 26 // 保管する 27 File outputFile = new File("output.xlsx"); 28 OutputStream outp = new FileOutputStream(outputFile); 29 book.write(outp); 30 31 book.close(); 32 } 33 34 public static void main(String argv[]) throws Exception { 35 PoiSample poi = new PoiSample(); 36 poi.loadAndSave(); 37 } 38}

投稿2016/11/11 10:31

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2016/11/14 08:35

回答、サンプルまでありがとうございます。 一般的にExcel出力は大量件数でやらない(もしくはcsv出力でマクロ読み込み)とかで対応してるんですかね。 なかなか難しそうです。。。
syncrock

2016/11/15 05:14

サンプルを試させて頂きました。 既に値のある場所への変更は出来ないため、1行目にヘッダーありきでしようするならなんとか・・・。 という感じでしょうか。 ありがとうございました。
guest

0

こんにちは
Spire.XLS FOR JAVAという無料のライブラリをお勧め。
このもので解決できるそうです。

投稿2020/12/04 02:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

XSSFではテンプレートを読み込み、そこに出力。ということは可能でしょうか。

可能ですが、工夫せずに書くと、テンプレ元ファイルが書き換わったりします。

私は、以下のサイトを参考にテンプレ読み込みして書き込んで・・
というソースを仕事で書きました。

http://so-kai-app.sakura.ne.jp/blog/category/java/apache-poi/

XSSFになってリソース消費は抑えられるようになったものの、
体感ではまだまだ、もっさりした応答になりますね・・。

HSSF時代は先にマクロ着きExcelを渡しておいて、CSVダウンロードしてもらってたりとか、
VBSをダウンロードしてもらって実行したりとかしたものですが・・。
(現在は全くお勧めできません。)

投稿2016/11/11 05:06

akio221

総合スコア716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2016/11/11 05:13

回答ありがとうございます。 つまり、XSSFの拡張であるSXSSFでも同じ。ということでしょうか? つまり、SXSSFの読み取り不可というのは、中の値の参照のことであって、何かのExcelを開いて書き込むというのはOKということでしょうか?
akio221

2016/11/11 05:24

SXSSF自体が、XSSFベースなのでそうだと思います。 SXSSFで試したわけではないので断定ではありません、すみません。
akio221

2016/11/11 05:59

すみません、結果、ウソ回答かもしれません。 手元のソースでテンプレート読んでるヤツで試してみたのですが、 WorkbookFactoryで、POIのファイルを開いてworkbokインターフェースを拾い、 拾ったWorkbook tmpをそのままコンストラクタに渡して、 SXSSFWorkbook myBook = new SXSSFWorkbook((XSSFWorkbook) tmp); としてみたのですが、テンプレートに存在しているはずのセルに page1Sheet.getRow(0).getCell(0).setCellValueしたところで落ちました。 (XSSFでは動いているソースで・・。手元のpoi3.14です。) この辺工夫してできるものかどうか、ちょっと判別つきませんでした。
syncrock

2016/11/11 07:48

やはり出来ないのかもしれないですね。。。 わざわざ検証して頂き、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問