作成日: 2020/06/16 最終更新日: 2020/06/16
文書種別
使用方法
詳細
Excel for .NETには、列幅を自動調整する機能は用意されておりません。
代替方法として、関連するスタイルのフォントサイズおよびテキストから各セル幅を計算し、これに基づいて列全体の幅をリサイズする手順が考えられます。
◎サンプルコード(VB)
代替方法として、関連するスタイルのフォントサイズおよびテキストから各セル幅を計算し、これに基づいて列全体の幅をリサイズする手順が考えられます。
◎サンプルコード(VB)
Imports C1.C1Excel
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
' Excelファイルのロード
C1XLBook1.Clear()
C1XLBook1.Load("..¥..¥Test01.xlsx")
' 列幅の自動調整
AutoSizeColumns(C1XLBook1.Sheets(0))
' xls形式で保存
C1XLBook1.Save("..¥..¥saved_Test01.xls", FileFormat.Biff8)
' xlsx形式で保存
C1XLBook1.Save("..¥..¥saved_Test01.xlsx", FileFormat.OpenXml)
End Sub
Private Sub AutoSizeColumns(ByVal sheet As XLSheet)
Using g As Graphics = Graphics.FromHwnd(IntPtr.Zero)
Dim r As Integer, c As Integer
For c = 0 To sheet.Columns.Count - 1
Dim colWidth As Integer = -1
For r = 0 To sheet.Rows.Count - 1
Dim value As Object = sheet(r, c).Value
If Not (value Is Nothing) Then
' 値の取得(この時点では未フォーマット)
Dim text As String = value.ToString()
' セルにフォーマットが設定されたスタイルがある場合のフォーマット値
Dim s As XLStyle = sheet(r, c).Style
If Not (s Is Nothing) And s.Format.Length > 0 Then
Dim ifmt As IFormattable = TryCast(value, IFormattable)
If Not (ifmt Is Nothing) Then
Dim fmt As String = XLStyle.FormatXLToDotNet(s.Format)
text = ifmt.ToString(fmt, System.Globalization.CultureInfo.CurrentCulture)
End If
End If
' フォントの取得(デフォルトまたはスタイル)
Dim font As Font = C1XLBook1.DefaultFont
If Not (s Is Nothing) Then
If Not (s.Font Is Nothing) Then
font = s.Font
End If
End If
' 文字列の計測(許容誤差を若干追加)
Dim sz As Size = System.Drawing.Size.Ceiling(g.MeasureString(text + "XX", font))
' 最大幅を保存
If sz.Width > colWidth Then
colWidth = sz.Width
End If
End If
' 計測完了、列幅の設定
If colWidth > -1 Then
sheet.Columns(c).Width = C1XLBook.PixelsToTwips(colWidth)
End If
Next
Next
End Using
End Sub
End Class
◎サンプルコード(C#)using C1.C1Excel;
namespace WindowsApplication1
{
public class Form1 : System.Windows.Forms.Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, System.EventArgs e)
{
// Excelファイルのロード
c1XLBook1.Clear();
c1XLBook1.Load(@"..¥..¥Test01.xlsx");
// 列幅の自動調整
AutoSizeColumns(c1XLBook1.Sheets[0]);
// xls形式で保存
//c1XLBook1.Save(tempdir + "autoSized.xls");
c1XLBook1.Save(@"..¥..¥saved_Test01.xls", FileFormat.Biff8);
// xlsx形式で保存
c1XLBook1.Save(@"..¥..¥saved_Test01.xlsx", FileFormat.OpenXml);
}
private void AutoSizeColumns(XLSheet sheet)
{
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
for (int c = 0; c < sheet.Columns.Count; c++)
{
int colWidth = -1;
for (int r = 0; r < sheet.Rows.Count; r++)
{
object value = sheet[r, c].Value;
if (value != null)
{
// 値の取得(この時点では未フォーマット)
string text = value.ToString();
// セルにフォーマットが設定されたスタイルがある場合のフォーマット値
C1.C1Excel.XLStyle s = sheet[r, c].Style;
if (s != null && s.Format.Length > 0 && value is IFormattable)
{
string fmt = XLStyle.FormatXLToDotNet(s.Format);
text = ((IFormattable)value).ToString(fmt, CultureInfo.CurrentCulture);
}
// フォントの取得(デフォルトまたはスタイル)
Font font = this.c1XLBook1.DefaultFont;
if (s != null && s.Font != null)
{
font = s.Font;
}
// 文字列の計測(許容誤差を若干追加)
Size sz = Size.Ceiling(g.MeasureString(text + "XX", font));
// 最大幅を保存
if (sz.Width > colWidth)
colWidth = sz.Width;
}
}
// 計測完了、列幅の設定
if (colWidth > -1)
sheet.Columns[c].Width = C1XLBook.PixelsToTwips(colWidth);
}
}
}
}
}
旧文書番号
85716