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

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

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

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

Q&A

1回答

3939閲覧

Java POIのsetCellValueで行末の特殊文字が消えてしまう

xnorinorinorix

総合スコア4

Java

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

0グッド

0クリップ

投稿2020/04/17 09:20

編集2020/04/20 10:20

JAVA8で、Apache POIを使用して<br>タグを含む文字列をExcel出力しています。
出力前に<br>を\nに変換して以下のように出力していますが、
行末の\nが出力時に消えてしまうのを解決したいです(出力するようにしたい)

java

1// 抜粋です 2import org.apache.poi.ss.usermodel.CellStyle; 3import org.apache.poi.ss.usermodel.CreationHelper; 4import org.apache.poi.ss.usermodel.Font; 5import org.apache.poi.ss.usermodel.IndexedColors; 6import org.apache.poi.ss.usermodel.Row; 7import org.apache.poi.ss.usermodel.Sheet; 8import org.apache.poi.ss.usermodel.Workbook; 9import org.apache.poi.xssf.usermodel.XSSWorkbool; 10 11Workbook wb = new XSSFWorkbook(); 12Sheet sheet = wb.createSheet("hoge"); 13CreationHelper helpser = wb.getCreationHelper(); 14Font font = wb.createFont(); 15font.setFontName("MS Pゴシック"); 16 17CellStyle defaultStyle = wb.createCellStyle(); 18defaultStyle.setFont(font); 19defaultStyle.setDataFormat(helper.createDataFormat().getFormat("text")); 20defaultStyle.setBorderTop(CellStyle.BORDER_THIN); 21defaultStyle.setBorderRight(CellStyle.BORDER_THIN); 22defaultStyle.setBorderBottom(CellStyle.BORDER_THIN); 23defaultStyle.setBorderLeft(CellStyle.BORDER_THIN); 24 25Row row = sheet.createRow(2); 26 27row.createCell(7).setCellStyle(defaultStyle); 28row.getCell(7).setCellValue(hoge.getHoge().replace("<br>", "\n")); 29 30sheet.autoSizeColumn(7, true); 31 32wb.write(fos);

例えば、hoge.getHoge()が以下の値だとすると

1行目<br>2行目<br>3行目<br><br>

replaceの結果は以下になりますが

1行目\n2行目\n3行目\n\n

Excelの出力内容(セル内改行)は、以下になってしまいます。

/_/_/_/_/_/_/_/_/_/_/_/_行頭 1行目 2行目 3行目 /_/_/_/_/_/_/_/_/_/_/_/_行末

期待している出力内容は以下なのですが、
解決方法をご教示いただきたいです。

/_/_/_/_/_/_/_/_/_/_/_/_行頭 1行目 2行目 3行目 /_/_/_/_/_/_/_/_/_/_/_/_行末

因みに以下のように、別の文字で挟むと出力はされます。
(”_”の代わりに半角スペースでも同じような出力が可能です。)

java

1row.getCell(7).setCellValue(hoge.getHoge().replace("<br>", "\n") + "_");
/_/_/_/_/_/_/_/_/_/_/_/_行頭 1行目 2行目 3行目 _ /_/_/_/_/_/_/_/_/_/_/_/_行末

記載がわかりづらかったらすみません。
不足点などあればご指摘ください。

使用ライブラリは以下です

poi-3.7.jar poi-ooxml-3.7.jar

以上、よろしくお願いいたします。

追記(2020/04/18 3時42分)
以下のように、空文字で挟むのは駄目でした。(当たり前かもしれませんが)
他には”¥r¥n”で挟むことも試しました。がこちらも駄目

java

1row.getCell(7).setCellValue(hoge.getHoge().replace("<br>", "\n") + "");
/_/_/_/_/_/_/_/_/_/_/_/_行頭 1行目 2行目 3行目 /_/_/_/_/_/_/_/_/_/_/_/_行末

追記(2020/04/18 4時04分)
追記書いてて思い立ったのでメモ

半角スペースで挟んで出力
→出力内容をgetCellValueして最終行のスペースを除いてsetすると?

根本解決ではないし、力技だし、
同じことが起きそうだし、ですが念の為確認します。

追記(2020/04/20 19時00分)
上記のgetStringCellValueで取得したものをsetする方法でもだめでした。
setRichStringする方法も試したかったのですが、RichText形式の変換方法などよくわからず断念
お手上げです。
マクロ仕込んで何とかする方法を調べてみます。

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

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

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

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

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

guest

回答1

0

単純にエスケープシーケンスではできませんか?
"\n"

投稿2020/04/17 11:43

m.ts10806

総合スコア80888

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

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

xnorinorinorix

2020/04/17 18:40

ご回答ありがとうございます。 職場の環境なのですぐには確認できませんが、例で言う1行目と2行目の次は正しく改行されるので、改行コード自体は正しく認識されていると思ってます。 そこに更にエスケープを加えると、改行コードが無効になり、"\n"という文字列が改行の箇所に出力されるのではと予想しています。 予想で語ってすみません。確認後再回答します。
xnorinorinorix

2020/04/20 09:57

確認しましたが予想通り改行箇所が"\n"という文字列となりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問