使用StreamWriter更改Excel列宽

时间:2018-09-17 19:47:28

标签: excel vb.net

我需要这段代码的帮助。

我正在研究使用StreamWriter将数据表数据导出到excel工作表的代码,一切都很好,但是我想更改excel中每一列的excel列宽度,我只能更改一次所有列的宽度。

这是列宽的代码:

.WriteLine("  <Column ss:Width=""100""/>")

是否可以更改列(0)的宽度= 20和列(1)的宽度= 18 等等 ? 或使其自动适应??

谢谢。

这是我的代码:

Imports System.IO
Public Class ExportToExcelClr
Public Sub ExportToExcel(datatable As DataTable, GV As DataGridView, filename As String, Optional OpenDialog As Boolean = False, Optional SameColumnsWidth As Boolean = True)
    Dim FlNm As String = ""
    Dim sv As New SaveFileDialog
    sv.FileName = filename
    sv.Filter = "|*.xls"
    If sv.ShowDialog <> DialogResult.OK Then Exit Sub
    FlNm = sv.FileName
    Dim fs As New StreamWriter(FlNm, False)
    With fs
        .WriteLine("<?xml version=""1.0""?>")
        .WriteLine("<?mso-application progid=""Excel.Sheet""?>")
        .WriteLine("<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"">")
        .WriteLine("  <Styles>")
        .WriteLine("  <Style ss:ID=""hdr"">")
        .WriteLine("  <Alignment ss:Horizontal=""Center""/>")
        .WriteLine("  <Borders>")
        .WriteLine("    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("  </Borders>")
        .WriteLine("  <Font ss:FontName=""Droid Arabic Kufi"" ss:Size=""8"" ss:Bold=""1""/>") 'SET FONT
        .WriteLine("  </Style>")
        .WriteLine("  <Style ss:ID=""ksg"">")
        .WriteLine("  <Alignment ss:Vertical=""Bottom""/>")
        .WriteLine("  <Borders/>")
        .WriteLine("  <Font ss:FontName=""Arial""/>") 'SET FONT
        .WriteLine("  </Style>")
        .WriteLine("  <Style ss:ID=""isi"">")
        .WriteLine("  <Borders>")
        .WriteLine("    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>")
        .WriteLine("  </Borders>")
        .WriteLine("  <Font ss:FontName=""Arial"" ss:Size=""11""/>")
        .WriteLine("  </Style>")
        .WriteLine("  </Styles>")
        .WriteLine("  <Worksheet ss:Name=""sheet1"">")
        .WriteLine("  <Table>")


        'If SameColumnsWidth Then
        'For i = 0 To GV.ColumnCount - 1
        .WriteLine("  <Column ss:Width=""100""/>")
            'Next
            'End If

            .WriteLine("  <Row ss:StyleID=""ksg"">")

        For i As Integer = 0 To GV.ColumnCount - 1
            Application.DoEvents()
            .WriteLine("  <Cell ss:StyleID=""hdr"">")
            .WriteLine("    <Data ss:Type=""String"">{0}</Data>", GV.Columns.Item(i).HeaderText)
            .WriteLine("  </Cell>")
        Next


        .WriteLine("  </Row>")
        For intRow As Integer = 0 To datatable.Rows.Count - 1
            Application.DoEvents()
            .WriteLine("  <Row ss:StyleID=""ksg"" ss:utoFitHeight =""0"">")
            For intCol As Integer = 0 To datatable.Columns.Count - 1
                Application.DoEvents()
                .WriteLine("  <Cell ss:StyleID=""isi"">")
                .WriteLine("  <Data ss:Type=""String"">{0}</Data>", GV.Item(intCol, intRow).Value.ToString)
                .WriteLine("  </Cell>")
            Next
            .WriteLine("  </Row>")
        Next
        .WriteLine("  </Table>")
        .WriteLine("  </Worksheet>")
        .WriteLine("</Workbook>")
        .Close()
        If OpenDialog Then
            Dim msg1
            msg1 = MsgBox("تم الاستخراج ... هل تريد فتح الملف ؟", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Export")
            If msg1 = vbNo Then Exit Sub
            Process.Start(FlNm)
        End If
    End With
End Sub
Sub DataGridView_COLORE_FOR_ME(ByVal DataGridViewXT As Object)
    Try
        '-------------------------------------------------------------------------------------------
        DataGridViewXT.DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 255)
        DataGridViewXT.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(255, 255, 192)
        '-------------------------------------------------------------------------------------------
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.MsgBoxRtlReading, "Error")
    End Try
End Sub
End Class 

1 个答案:

答案 0 :(得分:0)

如果将此属性(AutoFitWidth)指定为True(“ 1”),则意味着该列应仅针对数字和日期值自动调整大小。我们不会自动调整文本值。

如果同时存在ss:Width和ss:AutoFitWidth,则行为如下:

ss:AutoFitWidth="1" and ss:Width is unspecified: Autofit the column width to fit the content.
ss:AutoFitWidth="1" and ss:Width is specified: Set the column to the specified width and only autofit if the size of the content is larger than the specified width.
ss:AutoFitWidth="0" and ss:Width is unspecified: Use the default column width.
ss:AutoFitWidth="0" and ss:Width is specified: Use the specified width.

来自这里: https://www.codeproject.com/Questions/789892/How-to-set-autosize-the-cell-of-excell-sheet-when

因此,您的行将更改为:

.WriteLine("  <Column ss:Width=""100""/>")

任何一个

.WriteLine("  <Column ss:AutoFitWidth=""1"" ss:Width=""20""/>")

.WriteLine("  <Column ss:AutoFitWidth=""1""/>")

这些列在输出文件中按顺序排序,因此您可以将它们放入:

.WriteLine("  <Column ss:Width=""8""/>")
.WriteLine("  <Column ss:Width=""16""/>")
.WriteLine("  <Column ss:Width=""24""/>")
.WriteLine("  <Column ss:Width=""11""/>")

For i As Integer = 0 To GV.ColumnCount - 1
    .WriteLine("  <Column ss:AutoFitWidth=""1""/>")
Next

我首先要在Excel中创建所需的文件。将其另存为XML,然后在Google Chrome或IE中查看XML。这将向您显示xml的外观。