こういった文字化けは、ITエンジニアを長年やっているとよく遭遇する問題ですが、調査してみました。
改行コードについては、
で説明してあります。
目次
[C#] ExcelからPDFに変換したら、改行コードが点(・)に文字化けした
以下のようなプログラムをC#で書いてみました。
Range range1 = sheet1.Range[“AN9”, “AW12”];
range1.MergeCells = true;
range1.Value = “あああ” + Environment.NewLine + “いいい” + Environment.NewLine + “ううう” + Environment.NewLine + “えええ”;
Excelでは、以下のように表示されました。
これをPDFに変換してみました。
あれあれ?
・に文字化けしているではないですか。
いろいろと試してみたところ、以下のように修正するとよいようです。
range1.Value = “あああ” + “\n” + “いいい” + “\n” + “ううう” + “\n” + “えええ”;
これは奇妙です。
わざわざ、OSに非依存の
Environment.NewLine
を使って改行しているのに、この方法はダメで、
LF(“\n”)
にしないと文字化けしてしまうんですね。
Excelのセル内改行コードは0x0A(LF, “\n”)
よくよく調べてみたところ、
Excelのセル内で、ALT+Enterで改行したときに、改行コードは0x0A(LF)が入る
ようです。
そこで、今度は試しに、0x0D(CR, “\r”)を入力してみました。
range1.Value = “あああ” + “\r” + “いいい” + “\r” + “ううう” + “\r” + “えええ”;
0x0D(CR, “\r”)を入力すると、Excelのセル内では無視され、
ExcelをPDFに変換すると0x0D(CR, “\r”)は点(・)に文字化けするようです。
C#にVBのvbCr、vbLf、vbCrLfといったマクロ定義はない
VBの場合、以下のような感じで、テキストの中のCRLFをLFに変換すればよいようです。
Sheet1.Range(“A1”).Value = Replace(Me.TextBox1.Text, vbCrLf, vbLf)
ところで、VBでは
vbCr(ControlChars.Cr)、
vbLF(ControlChars.Lf)、
vbCrLf(ControlChars.CrLf)
といったマクロが定義されていますが、C#にはこの種のマクロ定義は存在しないようです。
直接、プログラムにエスケープコードを書くことに違和感のある人は以下のようなクラスを追加するしかないようです。
public sealed class ControlChars {
public const char Back = ‘\b’;
public const char Cr = ‘\r’;
public const string CrLf = “\r\n”;
public const char FormFeed = ‘\f’;
public const char Lf = ‘\n’;
public const string NewLine = “\r\n”;
public const char NullChar = ‘\0’;
public const char Quote = ‘”‘;
public const char Tab = ‘\t’;
public const char VerticalTab = ‘\v’;
}
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント