DioDocs for Excel
DioDocs for Excel
sjs ファイルのインポートとエクスポート
ファイル操作 > SpreadJS ファイルのインポートとエクスポート > sjs ファイルのインポートとエクスポート

SpreadJS V16J から、大規模で複雑なファイルをより高速に処理し、保存時によりサイズの小さなファイルを生成するために、新しいファイル形式 sjs が導入されました。新しい sjs 形式は、複数の小さな JSON ファイルを含む zip ファイルであり、xlsx ファイルの XML 構造と同様の構造になっています。

本製品では、xlsx や csv などのファイル形式と同様に、新しい sjs ファイル形式をインポートおよびエクスポートすることができます。sjs ファイルをインポートするには、Workbook クラスの Open メソッドを使用します。ファイル読み込み後、Workbook クラスの Save メソッドを使用して xlsx ファイルや sjs ファイルにエクスポートすることができます。sjs ファイルを読み込み保存する際に、OpenFileFormat  列挙型および SaveFileFormat 列挙型の新しいオプション「Sjs」を使用することができます。

次のサンプルコードは、ファイル名を指定して sjs ファイルをインポートしエクスポートする方法を示しています。

C#
コードのコピー
// ワークブックを初期化します
Workbook workbook = new Workbook();

// sjs ファイルを開きます
workbook.Open("ProjectPlan.sjs", OpenFileFormat.Sjs);

// sjs ファイルを保存します
workbook.Save("SaveProjectPlan.sjs", SaveFileFormat.Sjs);

次のサンプルコードは、ファイルストリームから sjs ファイルをインポートおよびエクスポートする方法を示しています。

C#
コードのコピー
// ワークブックを初期化します
Workbook workbook = new Workbook();

// ストリームから sjs ファイルを開きます
var importStream = new FileStream("ProjectPlan.sjs", FileMode.Open);
workbook.Open(importStream, OpenFileFormat.Sjs);

// sjs ファイルをストリームに保存します
var exportStream = new FileStream("SaveProjectPlan.sjs", FileMode.Create);
workbook.Save(exportStream, SaveFileFormat.Sjs);

さらに、sjs ファイルのインポートとエクスポートをカスタマイズできる SjsOpenOptions クラスと SjsSaveOptions クラスがあります。これらのオプションは、多数の数式、スタイル、未使用の定義された名前を含むファイルなど、サイズの大きなファイルを処理する場合に特に便利です。オプションの一覧は以下のとおりです。

クラス オプション 説明
インポートのオプション SjsOpenOptions IncludeStyles sjs ファイルを読み込む際にスタイルを含めるかどうかを指定します。デフォルトは true です。
IncludeFormulas sjs ファイルを読み込む際に数式を含めるかどうかを指定します。デフォルトは true です。
エクスポートのオプション SjsSaveOptions IncludeStyles sjs ファイルを保存する際にスタイルを含めるかどうかを指定します。デフォルトは true です。
IncludeFormulas sjs ファイルを保存する際に数式を含めるかどうかを指定します。デフォルトは true です。
IncludeUnusedNames sjs ファイルを保存する際に未使用の定義された名前を含めるかどうかを指定します。デフォルトは true です。
IncludeEmptyRegionCells sjs ファイルを保存する際に使用範囲外の空のセルを含めるかどうかを指定します。デフォルトは true です。
IgnoreRangeOutOfRowCoulumnCount sjs ファイルを保存する際に RowCount(行数)と ColumnCount(列数)の外にあるデータを無視するかどうかを指定します。デフォルトは false です。
IncludeAutoMergedCells sjs ファイルを保存する際にセルの自動結合を含めるかどうかを指定します。デフォルトは false です。
IncludeBindingSource sjs ファイルを保存する際に連結されたデータソースを含めるかどうかを指定します。デフォルトは true です。

次のサンプルコードは、SjsOpenOptions と SjsSaveOptions を使用して sjs ファイルをインポートしエクスポートする方法を示しています。

C#
コードのコピー
// ワークブックを初期化します
Workbook workbook = new Workbook();

// 数式を含む sjs ファイルを開きます
SjsOpenOptions openOptions = new SjsOpenOptions();
openOptions.IncludeFormulas = false;
openOptions.IncludeStyles = false;
workbook.Open("ProjectPlan.sjs", openOptions);

// スタイルを含む sjs ファイルを保存します
SjsSaveOptions saveOptions = new SjsSaveOptions();
saveOptions.IncludeStyles = false;
saveOptions.IncludeFormulas = true;
saveOptions.IncludeUnusedNames = false;
saveOptions.IncludeEmptyRegionCells = false;
workbook.Save("SaveProjectPlan.sjs", saveOptions);

sjs ファイル内のすべての JSON ファイルを1つの JSON 文字列またはストリームに統合するには、ToSjsJson メソッドを使用します。なお、このメソッドでも SjsSaveOptions を使用することができます。

クラス メソッド 説明
Workbook ToSjsJson() ワークブックから JSON 文字列を生成します。sjs ファイル内のすべての JSON ファイルを1つの文字列に統合します。
ToSjsJson(SjsSaveOptions options) 保存オプションを使用してワークブックから JSON 文字列を生成します。sjs ファイル内のすべての JSON ファイルを1つの文字列に統合します。
ToSjsJson(Stream stream) sjs ファイル内のすべてのJSON ファイルを1つの JSON 文字列に統合し、その文字列をストリームに格納します。
ToSjsJson(Stream stream, SjsSaveOptions options) 保存オプションを使用してsjs ファイル内のすべての JSON ファイルを1つの JSON 文字列に統合し、その文字列をストリームに格納します。
FromSjsJson(string json) sjsファイルの内容を含むJSON文字列からワークブックを生成します。
FromSjsJson(string json, SjsOpenOptions options) sjsファイルの内容を含むオープンオプションを使用して、JSON文字列からワークブックを生成します。
FromSjsJson(Stream stream) sjsファイルの内容を含むJSONストリームからワークブックを生成します。
FromSjsJson(Stream stream, SjsOpenOptions options) sjsファイルの内容を含むオープンオプションを使用して、JSON ストリームからワークブックを生成します。

次のサンプルコードは、sjs ファイルを1つの JSON 文字列に統合し、その文字列をストリームに保存しています。

C#
コードのコピー
// ワークブックを初期化します
Workbook workbook = new Workbook();

// sjs ファイルを開きます
workbook.Open("ProjectPlan.sjs", OpenFileFormat.Sjs);

// sjs ファイルから JSON 文字列を生成し、ストリームに保存します
var exportStream = new FileStream("SaveProjectPlan.json", FileMode.Create);
workbook.ToSjsJson(exportStream);

ピクセルベースでの列幅設定

DioDocs for Excelでは、.sjsファイルをPDFや画像としてエクスポートする際、WorkbookOptionsクラスのPixelBasedColumnWidthプロパティを使用して、文字ではなくピクセルに基づいて列幅を設定することができます。

ピクセルベースでの列幅を設定する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// Initialize WorkbookOptions.
WorkbookOptions workbookOptions = new WorkbookOptions();

// Enable pixel-based column width for the workbook.
workbookOptions.PixelBasedColumnWidth = true;
var workbook = new Workbook(workbookOptions);

// Open .sjs file.
workbook.Open("Event budget.sjs");
IWorksheet worksheet = workbook.Worksheets[0];

// Save to a PDF and PNG file.
workbook.Save("SavePDFWithPixelBasedColumnWidth.pdf");
worksheet.ToImage("SavePDFWithPixelBasedColumnWidth.png");

行数と列数

DioDocs for Excelでは、.sjsファイルの入出力の際、ワークシートの行数と列数が決定されます。また、IWorksheet インタフェースの RowCount および ColumnCount プロパティを使用することで行数・列数を明示的に指定することも可能です。コード上で行や列を挿入・削除した場合、それに合わせてRowCount および ColumnCount プロパティの値も増減します。

また、SjsSaveOptions クラスの IgnoreRangeOutOfRowColumnCount プロパティを使用することで、.sjs形式でエクスポートする際、指定した行数・列数の外側にあるデータを無視するかどうかを設定することが可能です。このプロパティのデフォルト値は"false"なので、指定した行数・列数の外側にあるデータも.sjsファイルに出力されます。

行数・列数を指定して、.sjsファイルにエクスポートする方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// 新しいワークブックを生成します
var workbook = new Workbook();

// .sjsファイルを開きます
workbook.Open("LoanDetails.sjs", OpenFileFormat.Sjs);

// 先頭のワークシートを取得します
var worksheet = workbook.Worksheets[0];

// 行数と列数をそれぞれ4に調整します
worksheet.RowCount = 4;
worksheet.ColumnCount = 4;

// 指定された行数・列数の外側にあるコンテンツをエクスポートしない設定とします
SjsSaveOptions saveOptions = new SjsSaveOptions
{
    IgnoreRangeOutOfRowColumnCount = true
};

// .sjs形式で保存します
workbook.Save("IgnoreDataOption.sjs", saveOptions);

制限事項


セルの修飾(セルデコレーション)

DioDocs for Excel では、ICornerFold や ICellDecorationIcon インタフェースのインスタンスを IRange インタフェースの Decoration プロパティに設定することで、セルに対して角折(ドッグイヤー)やアイコンなどの装飾(デコレーション)を追加することが可能です。また、角折やアイコンの位置を設定するために CornerPosition 列挙体や IconPosition 列挙体も定義されています。

セル修飾の追加

セルの修飾をするには、CornerFoldCellDecorationIcon コンストラクタを使用して ICornerFold や ICellDecorationIcon インタフェースのインスタンスを生成し、角折やアイコンの設定をあらかじめ行っておく必要があります。

セルに修飾を追加する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// ワークブックを新規に生成します
var workbook = new Workbook();

// 先頭のワークシートを取得します
IWorksheet worksheet = workbook.Worksheets[0];

// セルに値を設定します
worksheet.Range["C4"].Value = "FY 2019";
worksheet.Range["C5"].Value = "Sales";
worksheet.Range["C6"].Value = "Monthly";

string[] months = { "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar" };
int[] monthlySales = { 188897, 208146, 226196, 277318, 263273, 259845, 241047, 256306, 195845, 204934, 257852, 227779 };

for (int i = 0; i < months.Length; i++)
{
    worksheet.Range[$"B{7 + i}"].Value = months[i];
    worksheet.Range[$"C{7 + i}"].Value = monthlySales[i];
}

// セルの色(背景・罫線)を設定します
worksheet.Range["B4:C6"].Interior.Color = Color.FromArgb(173, 216, 230);
worksheet.Range["C4:C6"].Borders.Color = Color.FromArgb(0, 0, 0);
worksheet.Range["B7:B18"].Interior.Color = Color.FromArgb(211, 211, 211);
worksheet.Range["B7:C18"].Borders.Color = Color.FromArgb(0, 0, 0);

// セルのスタイルを設定します
worksheet.Range["B4:B6"].Borders[BordersIndex.EdgeLeft].LineStyle = BorderLineStyle.Thin;
worksheet.Range["B4:B6"].Borders[BordersIndex.EdgeTop].LineStyle = BorderLineStyle.Thin;
worksheet.Range["B4:B6"].Merge();
worksheet.Range["C2:D18"].ColumnWidth = 15;
worksheet.Range["B2:D18"].HorizontalAlignment = HorizontalAlignment.Center;
worksheet.Range["B2:C18"].VerticalAlignment = VerticalAlignment.Center;
worksheet.Range["B4:C6"].Font.Bold = true;
worksheet.Range["C7:C18"].NumberFormat = "#,##0";
worksheet.Range["C2"].HorizontalAlignment = HorizontalAlignment.Right;

// 最も"Sales"が高いセルを修飾します
ICornerFold cornerFold1 = new CornerFold(Color.Red, CornerPosition.LeftTop, 8);
ICellDecorationIcon cellDecorationIcon1 = new CellDecorationIcon(
    "data:image/svg+xml;base64" +
    ",PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxM" +
    "iAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMD" +
    "Avc3ZnIj4KPHJlY3Qgd2lkdGg9IjEyIiBoZWl" + 
    "naHQ9IjEyIiBmaWxsPSJ0cmFuc3BhcmVu" +
    "dCIvPgo8cGF0aCBmaWxsLXJ1bGU9I" +
    "mV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTT" +
    "cgOUg1TDUgNS45NjA0NmUtMDhIN0w3IDlaTTYgMTBDNi" +
    "41NTIyOCAxMCA3IDEwLjQ0NzcgNyAxMUM"
      + "3IDExLjU1MjMgNi41NTIyOCAxMiA2IDEyQzUuNDQ3NzIgMTI" +
      "gNSAxMS41NTIzIDUgMTFDNSAxMC40NDc3IDUuNDQ3NzIg" +
      "MTAgNiAxMFoiIGZpbGw9InJlZCIvPgo8L3N2Zz4K",
    12,
    12,
    IconPosition.OutsideRight);
worksheet.Range["C10"].Decoration = new CellDecoration(cornerFold1, new List<ICellDecorationIcon>() { cellDecorationIcon1 });
worksheet.Range["D10"].Value = "Highest";

// 最も"Sales"が低いセルを修飾します
ICornerFold cornerFold2 = new CornerFold(Color.Green, CornerPosition.LeftTop, 8);
ICellDecorationIcon cellDecorationIcon2 = new CellDecorationIcon(
    "data:image/svg+xml;base64," +
    "PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdC" +
    "b3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh" +
    "0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnI" +
    "j4KPHJlY3Qgd2lkdGg9IjEyIiBoZW" + 
    "lnaHQ9IjEyIiBmaWxsPSJ0cmFuc3BhcmVudCIvP" +
    "go8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXA" +
    "tcnVsZT0iZXZlbm9kZCIgZD0iTTcgOUg1TDUgNS45NjA0" +
    "NmUtMDhIN0w3IDlaTTYgMTBDNi41NTIyOCAxMCA" +
    "3IDEwLjQ0NzcgNyAxMUM3IDExLjU1MjMgNi41NTIyO" +
    "CAxMiA2IDEyQzUuNDQ3NzIgMTIgNSAxMS41NTIzIDUgMT" +
    "FDNSAxMC40NDc3IDUuNDQ3NzIgMTAgNiAxM" +
    "FoiIGZpbGw9ImdyZWVuIi8+Cjwvc3ZnPgo=",
    12,
    12,
    IconPosition.OutsideRight);
worksheet.Range["C7"].Decoration = new CellDecoration(cornerFold2, new List<ICellDecorationIcon>() { cellDecorationIcon2 });
worksheet.Range["D7"].Value = "Lowest";

// ワークブックを.sjs形式で保存します
workbook.Save("CellDecoration.sjs");

セル修飾の削除

セルのすべての修飾を削除する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// セルのすべての修飾を削除します
worksheet.Range["C7"].Decoration = null;

アイコン修飾のみを削除する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// アイコン修飾のみ削除します
worksheet.Range["C7"].Decoration = new CellDecoration(cornerFold2, null);
            
// または

worksheet.Range["C7"].Decoration = new CellDecoration(cornerFold2);

角折のみを削除する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// 角折修飾のみを削除します
worksheet.Range["C7"].Decoration = new CellDecoration(null, new List<ICellDecorationIcon>() { cellDecorationIcon2 });

// または

worksheet.Range["C7"].Decoration = new CellDecoration(new List<ICellDecorationIcon>() { cellDecorationIcon2 });

メモ: セルの修飾は、SpreadJSの機能です。DioDocs for Excelは、.sjsおよび.ssjson形式へのエクスポート時のみ、セルの修飾をサポートします。

連結データソースの出力制御

DioDocs for Excel では、SjsSaveOptions の IncludeBindingSource プロパティを使用することで、.sjs形式にエクスポートする時に連結されたデータソースをファイルに出力するかどうかを設定することができます。

.sjsファイルにエクスポートする時、連結データソースを除く(ファイルに含めない)方法については、次のサンプルコードを参照してください。

C#
コードのコピー
// 新しいワークブックを生成します
var workbook = new Workbook();

// JSONデータソースを定義します
var dataSource = "{ \"ds\":" +
                 "[\n" +
                 "   {\"Area\": \"North America\",\"City\": \"Chicago\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 92800},\n" +
                 "   {\"Area\": \"North America\",\"City\": \"New York\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 92800},\n" +
                 "   {\"Area\": \"South America\",\"City\": \"Santiago\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 19550},\n" +
                 "   {\"Area\": \"Europe\",\"City\": \"Berlin\",\"Category\": \"Consumer Electronics\",\"Name\": \"Sony WH-1000XM4\",\"Revenue\": 30000},\n" +
                 "   {\"Area\": \"Asia\",\"City\": \"Tokyo\",\"Category\": \"Consumer Electronics\",\"Name\": \"Sony WH-1000XM4\",\"Revenue\": 45000},\n" +
                 "   {\"Area\": \"North America\",\"City\": \"Los Angeles\",\"Category\": \"Consumer Electronics\",\"Name\": \"Apple AirPods\",\"Revenue\": 60000},\n" +
                 "   {\"Area\": \"Europe\",\"City\": \"Paris\",\"Category\": \"Consumer Electronics\",\"Name\": \"Apple AirPods\",\"Revenue\": 55000},\n" +
                 "   {\"Area\": \"Asia\",\"City\": \"Seoul\",\"Category\": \"Consumer Electronics\",\"Name\": \"Samsung Galaxy Buds\",\"Revenue\": 40000},\n" +
                 "   {\"Area\": \"South America\",\"City\": \"Buenos Aires\",\"Category\": \"Consumer Electronics\",\"Name\": \"Samsung Galaxy Buds\",\"Revenue\": 35000},\n" +
                 "   {\"Area\": \"North America\",\"City\": \"Toronto\",\"Category\": \"Consumer Electronics\",\"Name\": \"Bose 785593-0050\",\"Revenue\": 50000}\n" +
                 " ]" +
                 "}";
            
// データソース用のワークシート追加し、テーブルを追加します
var dataSourceSheet = workbook.Worksheets.Add();
dataSourceSheet.Name = "DataSource";
var table = dataSourceSheet.Tables.Add(dataSourceSheet.Range["A1:E4"], true);
            
// テーブルの連結パスを設定します
table.BindingPath = "ds";
table.Columns[0].DataField = "Area";
table.Columns[1].DataField = "City";
table.Columns[2].DataField = "Category";
table.Columns[3].DataField = "Name";
table.Columns[4].DataField = "Revenue";
            
// データソース用ワークシートにデータソース(JSON)を設定します
dataSourceSheet.DataSource = new JsonDataSource(dataSource);

// 先頭のワークシートを取得し、ワークシート名を変更します
// ※このワークシートはピボットテーブル用に使用します
var pivotSheet = workbook.Worksheets[0];
pivotSheet.Name = "PivotSheet";
            
// ピボットテーブルを生成します
var pivotCache = workbook.PivotCaches.Create(table);
var pivotTable = pivotSheet.PivotTables.Add(pivotCache, pivotSheet.Range["A1"], "pivottable1");
            
// ピボットテーブルのフィールドを設定します
var fieldArea = pivotTable.PivotFields["Area"];
fieldArea.Orientation = PivotFieldOrientation.RowField;

var fieldCity = pivotTable.PivotFields["City"];
fieldCity.Orientation = PivotFieldOrientation.RowField;

var fieldName = pivotTable.PivotFields["Name"];
fieldName.Orientation = PivotFieldOrientation.ColumnField;

var fieldRevenue = pivotTable.PivotFields["Revenue"];
fieldRevenue.Orientation = PivotFieldOrientation.DataField;

pivotSheet.UsedRange.AutoFit();
pivotTable.ColumnGrand = false;
pivotTable.RowGrand = false;
pivotTable.Refresh();

// .sjs形式にエクスポートする際に連結データソースが出力されないようにIncludeBindingSourceプロパティをfalseに設定します
var saveOptions = new SjsSaveOptions();
saveOptions.IncludeBindingSource = false;

// ワークブックを保存します
workbook.Save("IncludeBindingSourceOption.sjs", saveOptions);
メモ: IncludeBindingSource プロパティは、データ連結によってテーブルのサイズが変わったとしても、元のサイズに戻してエクスポートするわけではありません。このプロパティは、エクスポート時にデータもあわせてエクスポートするかどうかを制御するのみです。