作成日: 2026/04/28 最終更新日: 2026/04/28
文書種別
不具合
状況
回避方法あり
詳細
FlexGrid の行ヘッダー(0列目)の Visible プロパティをFalseに設定し非表示にした状態で、SaveExcelメソッドでファイル出力します。
その結果、Excel ファイルに列ヘッダが表示されず、代わりに固定されていない通常行の1行目のデータがヘッダー位置に表示されるようになります。
その結果、Excel ファイルに列ヘッダが表示されず、代わりに固定されていない通常行の1行目のデータがヘッダー位置に表示されるようになります。
回避方法
Excel for .NETのC1XLBookを使用してExcelに保存します。
それには、C1XLBookのSheetにFlexGridの表示内容をコピーしたのち、C1XLBookのSaveメソッドを実行してください。
◎サンプルコード(VB)
Imports C1.C1Excel
Imports C1.Win.C1FlexGrid
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データの作成
Dim dt = New DataTable("test")
dt.Columns.AddRange({New DataColumn("A"), New DataColumn("B")})
For i = 0 To 9
dt.Rows.Add($"A{i}", $"B{i}")
Next
C1FlexGrid1.AutoGenerateColumns = False
C1FlexGrid1.Cols(0).Visible = False
C1FlexGrid1.Cols(1).Caption = "A列"
C1FlexGrid1.Cols(2).Caption = "B列"
C1FlexGrid1.Cols(1).Name = dt.Columns(0).ColumnName
' 元コードに合わせて dt.Columns(0) としていますが、通常は dt.Columns(1) かもしれません
C1FlexGrid1.Cols(2).Name = dt.Columns(0).ColumnName
C1FlexGrid1.DataSource = dt
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 新規ブックを作成し、シートにFlexGridのデータを追加
Dim book = New C1XLBook()
SaveSheet(C1FlexGrid1, book.Sheets(0), True)
' ブックを保存
book.Save("Test.xlsx")
End Sub
Private Sub SaveSheet(flex As C1FlexGrid, sheet As XLSheet, includeFixedCells As Boolean)
If sheet Is Nothing Then Return
' 1. FlexGrid情報の計算
' 可視状態の固定行・列数を計算
Dim visibleFixedRows As Integer = Enumerable.Range(0, flex.Rows.Fixed).Count(Function(r) flex.Rows(r).Visible)
Dim visibleFixedCols As Integer = Enumerable.Range(0, flex.Cols.Fixed).Count(Function(c) flex.Cols(c).Visible)
' 出力開始・終了位置を決定
Dim startRow As Integer = If(includeFixedCells, 0, flex.Rows.Fixed)
Dim startCol As Integer = If(includeFixedCells, 0, flex.Cols.Fixed)
Dim lastRow As Integer = flex.Rows.Count - startRow - 1
Dim lastCol As Integer = flex.Cols.Count - startCol - 1
If lastRow < 0 OrElse lastCol < 0 Then Return
' 2. Excelシートの設定
' 固定セルを含む場合は、Excelシートに固定表示設定を適用
If includeFixedCells Then
sheet.Rows.Frozen = visibleFixedRows
sheet.Columns.Frozen = visibleFixedCols
End If
' デフォルトフォントの設定
Dim font = flex.Font
Dim underlineStyle = If(font.Underline, XLUnderlineStyle.Single, XLUnderlineStyle.None)
sheet.Book.DefaultFont = New Font(font.Name, font.Size)
' デフォルトサイズの設定
sheet.DefaultRowHeight = C1XLBook.PixelsToTwips(flex.Rows.DefaultSize)
sheet.DefaultColumnWidth = C1XLBook.PixelsToTwips(flex.Cols.DefaultSize)
' 3. データコピー処理
For r As Integer = startRow To flex.Rows.Count - 1
If Not flex.Rows(r).Visible Then
sheet.Rows(r - startRow).Visible = False
End If
For c As Integer = startCol To flex.Cols.Count - 1
' 列の可視設定(最初の行のループ時のみ実行)
If r = startRow AndAlso Not flex.Cols(c).Visible Then
sheet.Columns(c - startCol).Visible = False
End If
' セルの値を設定
Dim cell = sheet(r - startRow, c - startCol)
cell.Value = flex(r, c)
Next
Next
End Sub
End Class◎サンプルコード(C#)
using C1.C1Excel;
using C1.Win.C1FlexGrid;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データの作成
var dt = new DataTable("test");
dt.Columns.AddRange(new[] { new DataColumn("A"), new DataColumn("B") });
for (var i = 0; i < 10; i++)
{
dt.Rows.Add($"A{i}", $"B{i}");
}
c1FlexGrid1.AutoGenerateColumns = false;
c1FlexGrid1.Cols[0].Visible = false;
c1FlexGrid1.Cols[1].Caption = "A列";
c1FlexGrid1.Cols[2].Caption = "B列";
c1FlexGrid1.Cols[1].Name = dt.Columns[0].ColumnName;
c1FlexGrid1.Cols[2].Name = dt.Columns[0].ColumnName;
c1FlexGrid1.DataSource = dt;
}
private void button1_Click(object sender, EventArgs e)
{
// 新規ブックを作成し、シートにFlexGridのデータを追加
var book = new C1XLBook();
SaveSheet(c1FlexGrid1, book.Sheets[0], true);
// ブックを保存
book.Save("Test.xlsx");
}
private void SaveSheet(C1FlexGrid flex, XLSheet sheet, bool includeFixedCells)
{
if (sheet == null) return;
// 1. FlexGrid情報の計算
// 可視状態の固定行・列数を計算
int visibleFixedRows = Enumerable.Range(0, flex.Rows.Fixed).Count(r = flex.Rows[r].Visible);
int visibleFixedCols = Enumerable.Range(0, flex.Cols.Fixed).Count(c = flex.Cols[c].Visible);
// 出力開始・終了位置を決定
int startRow = includeFixedCells ? 0 : flex.Rows.Fixed;
int startCol = includeFixedCells ? 0 : flex.Cols.Fixed;
int lastRow = flex.Rows.Count - startRow - 1;
int lastCol = flex.Cols.Count - startCol - 1;
if (lastRow < 0 || lastCol < 0) return;
// 2. Excelシートの設定
// 固定セルを含む場合は、Excelシートに固定表示設定を適用
if (includeFixedCells)
{
sheet.Rows.Frozen = visibleFixedRows;
sheet.Columns.Frozen = visibleFixedCols;
}
// デフォルトフォントの設定
var font = flex.Font;
var underlineStyle = font.Underline ? XLUnderlineStyle.Single : XLUnderlineStyle.None;
sheet.Book.DefaultFont = new Font(font.Name, font.Size);
// デフォルトサイズの設定
sheet.DefaultRowHeight = C1XLBook.PixelsToTwips(flex.Rows.DefaultSize);
sheet.DefaultColumnWidth = C1XLBook.PixelsToTwips(flex.Cols.DefaultSize);
// 3. データコピー処理
for (int r = startRow; r < flex.Rows.Count; r++)
{
if (!flex.Rows[r].Visible)
{
sheet.Rows[r - startRow].Visible = false;
}
for (int c = startCol; c < flex.Cols.Count; c++)
{
if (r == startRow && !flex.Cols[c].Visible)
{
sheet.Columns[c - startCol].Visible = false;
}
// セルの値を設定
var cell = sheet[r - startRow, c - startCol];
cell.Value = flex[r, c];
}
}
}
}
}