ClosedXML ライブラリを使用して Excel ファイルを生成しているときに、次の問題が発生しました: テキストがラップされた結合セルを含む行。
自動高さを手動で実行しようとしたときにも問題が発生しているため (行セパレーターをダブルクリック)、ライブラリを責めることはできません。
ClosedXML ライブラリを使用して Excel ファイルを生成しているときに、次の問題が発生しました: テキストがラップされた結合セルを含む行。
自動高さを手動で実行しようとしたときにも問題が発生しているため (行セパレーターをダブルクリック)、ライブラリを責めることはできません。
この問題に対して私が見つけた解決策は次のとおりです。マージされていない列のワークシートの定義された印刷領域の外側にあるマージされたセルからデータをコピーし、宛先列の幅がマージされた列の幅 1 に非常に近いことを確認し、次に自動調整を実行します。
コードは次のようになります。
private Dictionary<int, IList<int>> _RowAutofitBufferToMergedColsMapping = new Dictionary<int, IList<int>>();
// tells the exporter what column to use as a buffer
public void RegisterAutofitMapping(int startCol, int stopCol, int bufferCol)
{
var mergedCols = Enumerable.Range(startCol, stopCol - startCol + 1).ToList();
if (_RowAutofitBufferToMergedColsMapping.ContainsKey(bufferCol))
throw new ArgumentException(String.Format("Current worksheet already contains a mapping for buffer column {0}", bufferCol));
_RowAutofitBufferToMergedColsMapping[bufferCol] = mergedCols;
Worksheet.Column(bufferCol).Width = mergedCols.Sum(item => Worksheet.Column(item).Width + ColumnSeparatorWidth);
}
// performs row autofit
public void RowAutofit(int rowNo, int startCol, int stopCol, bool merge = true)
{
// finding mapping to use for autofit
IList<int> vals = Enumerable.Range(startCol, stopCol - startCol + 1).ToList();
String valsStr = String.Join(",", vals);
var mappingKey = _RowAutofitBufferToMergedColsMapping.Keys.FirstOrDefault(key => vals.SequenceEqual(_RowAutofitBufferToMergedColsMapping[key]));
if (mappingKey == 0)
throw new ArgumentException(String.Format("Could not mapping for provided columns - {0}", valsStr));
var range = Worksheet.Worksheet.Range(rowNo, startCol, rowNo, stopCol);
if (merge)
range.Merge();
range.Style.Alignment.SetWrapText();
if (copyStyles)
ClosedXmlExporter.CopyStyles(this, this, rowNo, startCol, rowNo, mappingKey, CopyStyleOptions.CopyAll());
var sourceValue = Worksheet.Cell(rowNo, startCol).Value;
Worksheet.Cell(rowNo, mappingKey)
.SetValue(sourceValue)
.Style.Alignment.SetWrapText(true);
Worksheet.Column(AutofitDummyCol).AdjustToContents(rowNo, rowNo);
}
Excel のヒントに触発されました。