-1

我正在将(Stimulsoft)报告导出到 Excel,但某些单元格文本变长并导致单元格之间的水平对齐失败。很明显,自动换行会扩大单元格高度,但不会将其传播到同一行中的所有其他单元格。

我设法使其CanGrow在所有单元格中更可靠地设置为 false,但这样用户需要在打开 Excel 后手动自动调整列宽。

有什么方法可以告诉 Excel 自动适应所有列的宽度?

4

4 回答 4

1

有,而且相当简单。

Private Sub AutoFitCols()

        Worksheets("Sheet1").Columns.AutoFit

End Sub

只需替换Sheet1为您希望列自动调整的工作表的名称。

如果您希望在打开工作簿时自动发生这种情况,您可以将代码放在Workbook_Open事件中,如下所示:

Private Sub Workbook_Open()

        Worksheets("Sheet1").Columns.AutoFit

End Sub

只要确保代码在ThisWorkbook代码模块中。

于 2015-08-24T12:53:32.377 回答
0

自动适应任何电子表格中所有列的键盘快捷键

Ctrl+A(全选)

Alt+H+O+I(自动调整列宽)

于 2015-08-24T14:44:32.973 回答
0

解决了它,下面是源代码以供将来参考。感谢@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;
于 2015-08-24T17:32:48.407 回答
0

在 excel 中选择所有工作表(在左上角),然后双击列 b 和 c 之间的线。在 VB 中:

Cells.Select
    Cells.EntireColumn.AutoFit
于 2015-08-24T12:53:40.373 回答