作成日: 2024/11/21 最終更新日: 2025/03/05
文書種別
不具合
状況
修正済み
詳細
ProcessTemplateメソッドを実行すると、出力後の帳票における図形の配置順が、元のテンプレートにおける配置順とは異なる順序に変化する場合があります。
具体的には、図形の左上セルが「1行目に近い」「A列に近い」ものから順に配置されていきます。
そのため、元のテンプレートにおける図形の配置順(Zオーダー)が変更され、図形の前面/背面が変化し、図形が隠れてしまうなどの問題が発生します。
具体的には、図形の左上セルが「1行目に近い」「A列に近い」ものから順に配置されていきます。
そのため、元のテンプレートにおける図形の配置順(Zオーダー)が変更され、図形の前面/背面が変化し、図形が隠れてしまうなどの問題が発生します。
回避方法
この問題はバージョン8.0.3で修正されました。
※修正版を適用しない場合の回避方法は以下の通りです。
ProcessTemprateメソッドの実行前に図形のZオーダー情報を保持しておき、メソッド実行後にその情報にて図形の位置を調整します。
※修正版を適用しない場合の回避方法は以下の通りです。
ProcessTemprateメソッドの実行前に図形のZオーダー情報を保持しておき、メソッド実行後にその情報にて図形の位置を調整します。
var ZOrderDictionary = SaveZOrderDictionary(workbook); // 図形のZオーダー情報を保持
workbook.ProcessTemplate();
RestoreZOrder(workbook, ZOrderDictionary); // 図形の位置を調整
// 図形のZオーダー情報を保持
static Dictionary<string, Dictionary<string, int>> SaveZOrderDictionary(Workbook workbook)
{
Dictionary<string, Dictionary<string, int>> ZOrderDictionary = new Dictionary<string, Dictionary<string, int>>();
for (int i = 0; i < workbook.Worksheets.Count; i++)
{
var worksheet = workbook.Worksheets[i];
Dictionary<string, int> shapeZOrderDictionary = new Dictionary<string, int>();
for (int j = 0; j < worksheet.Shapes.Count; j++)
{
var shape = worksheet.Shapes[j];
shapeZOrderDictionary.Add(shape.Name, shape.ZOrderPosition);
}
ZOrderDictionary.Add(worksheet.Name, shapeZOrderDictionary);
}
return ZOrderDictionary;
}
// 図形の位置を調整
static void RestoreZOrder(Workbook workbook, Dictionary<string, Dictionary<string, int>> ZOrderDictionary)
{
for (int i = 0; i < workbook.Worksheets.Count; i++)
{
var worksheet = workbook.Worksheets[i];
var worksheetName = worksheet.Name;
if (ZOrderDictionary.ContainsKey(worksheetName))
{
List<List<IShape>> allShapes = new List<List<IShape>>();
var shapeZOrderDictionary = ZOrderDictionary[worksheetName];
foreach (var shape in worksheet.Shapes)
{
var shapeOriginalName = shape.Name;
if (shapeOriginalName.Contains("_Report_"))
{
shapeOriginalName = shapeOriginalName.Substring(0, shapeOriginalName.LastIndexOf("_Report_"));
}
if (shapeZOrderDictionary.ContainsKey(shapeOriginalName))
{
int zOrderPosition = shapeZOrderDictionary[shapeOriginalName];
while (allShapes.Count <= zOrderPosition)
{
allShapes.Add(new List<IShape>());
}
var nowShapes = allShapes[zOrderPosition];
nowShapes.Add(shape);
}
}
int nowZOrder = 0;
for (int j = 0; j < allShapes.Count; j++)
{
var nowShapes = allShapes[j];
foreach (var shape in nowShapes)
{
while (shape.ZOrderPosition < nowZOrder)
{
shape.ZOrder(ZOrderType.BringForward);
}
while (shape.ZOrderPosition > nowZOrder)
{
shape.ZOrder(ZOrderType.SendBackward);
}
nowZOrder++;
}
}
}
}
}