我正在将(Stimulsoft)报告导出到 Excel,但某些单元格文本变长并导致单元格之间的水平对齐失败。很明显,自动换行会扩大单元格高度,但不会将其传播到同一行中的所有其他单元格。
我设法使其CanGrow
在所有单元格中更可靠地设置为 false,但这样用户需要在打开 Excel 后手动自动调整列宽。
有什么方法可以告诉 Excel 自动适应所有列的宽度?
我正在将(Stimulsoft)报告导出到 Excel,但某些单元格文本变长并导致单元格之间的水平对齐失败。很明显,自动换行会扩大单元格高度,但不会将其传播到同一行中的所有其他单元格。
我设法使其CanGrow
在所有单元格中更可靠地设置为 false,但这样用户需要在打开 Excel 后手动自动调整列宽。
有什么方法可以告诉 Excel 自动适应所有列的宽度?
有,而且相当简单。
Private Sub AutoFitCols()
Worksheets("Sheet1").Columns.AutoFit
End Sub
只需替换Sheet1
为您希望列自动调整的工作表的名称。
如果您希望在打开工作簿时自动发生这种情况,您可以将代码放在Workbook_Open
事件中,如下所示:
Private Sub Workbook_Open()
Worksheets("Sheet1").Columns.AutoFit
End Sub
只要确保代码在ThisWorkbook
代码模块中。
自动适应任何电子表格中所有列的键盘快捷键
Ctrl+A(全选)
Alt+H+O+I(自动调整列宽)
解决了它,下面是源代码以供将来参考。感谢@Soulfire 指出正确的方向。
一开始我什至没有使用,Interop
因为需求刚刚声明我需要将它保存到 Excel。
我联系了 Stimulsoft,他们指出我无法做到
由于在创建文件之前无法完成,因此我添加了要求用户打开它的功能。
using Excel = Microsoft.Office.Interop.Excel;
// Do lots of Stuff
SaveFileDialog saveFD = new SaveFileDialog();
saveFD.Filter = "Excel Files|*.xlsx;*.csv;*.xls|All files|*.*";
saveFD.FilterIndex = 1;
saveFD.RestoreDirectory = true;
saveFD.FileName = String.Format("MySavedFile_{0:yyyyMMddHHmmss}.xls", DateTime.Now);
if (saveFD.ShowDialog() == DialogResult.OK)
{
// In this example report is derived from the DevXpress XtraReport class
report.ExportToXls(saveFD.FileName);
// sanity note:Mensagem is a derived from devXpress XtraMessageBox
if (Mensagem.Confirm("File saved! Open it?"))
{
try
{
var excelApp = new Excel.Application();
excelApp.Visible = true;
var customEvent = new Excel.AppEvents_WorkbookOpenEventHandler(CustomWorkbookOpenEvent);
excelApp.WorkbookOpen += customEvent;
excelApp.Workbooks.Open(saveFD.FileName,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);}
catch (Exception)
{
Mensagem.Erro("Excel Failed to Open");
}
}
}
棘手的部分是锻炼 COM 对象。
private void CustomWorkbookOpenEvent(Excel.Workbook wb)
{
Excel._Worksheet sheet = (Excel.Worksheet)wb.ActiveSheet;
sheet.Columns.AutoFit();
}
编辑
一段时间后,我们发现互操作对我们来说真的很糟糕(部署在具有许多 Office 版本、dll 地狱等的许多用户上)。
我们发现NetOffice是一个很好的选择。刚刚替换了下面的 3 行:
using Excel = NetOffice.ExcelApi;
/* ... */
var customEvent = new Excel.Application_WorkbookOpenEventHandler(CustomWorkbookOpenEvent);
excelApp.WorkbookOpenEvent += customEvent;
在 excel 中选择所有工作表(在左上角),然后双击列 b 和 c 之间的线。在 VB 中:
Cells.Select
Cells.EntireColumn.AutoFit