读写excel文件,转换空格和英文为半角,将文字设置为全角

123 阅读3分钟

方法1: 直接在写入数据的时候替换,格式化后再设置到表格中

使用方法: 直接再将数据写入数据格的时候先调用该方法,用于将数据格式化

Imports System.Windows.Forms
Imports System.Data
Imports Microsoft.Data.SqlClient
Imports Microsoft.Office.Interop.Excel

       ''' <summary>
       ''' 全角スペースを半角に変換
       ''' 複数のスペースも半角に変換されます
       ''' 英字を半角に変換し、その他の文字はそのまま
       ''' </summary>
       ''' <param name="input"></param>
       ''' <returns></returns>
       Public Shared Function ConvertToHalfWidth(input As String) As String
           ' 入力が全て空白の場合、空文字列を返します
           If String.IsNullOrWhiteSpace(input.Replace(" ", " ")) Then
               Return ""
           End If

           Dim sb As New System.Text.StringBuilder()
           Dim previousWasSpace As Boolean = False

           For Each c As Char In StrConv(input, VbStrConv.Wide)
               Dim code As Integer = AscW(c)

               ' 現在の文字が全角スペースか半角スペースかを確認します
               If code = 12288 OrElse code = 32 Then
                   ' 前の文字がスペースでない場合は半角スペースを追加
                   If Not previousWasSpace Then
                       sb.Append(ChrW(32))
                       previousWasSpace = True
                   End If
               ElseIf (code >= 65281 AndAlso code <= 65374) Then
                   ' 全角英文字および数字を半角に変換
                   If (code >= 65313 AndAlso code <= 65338) OrElse (code >= 65345 AndAlso code <= 65370) OrElse (code >= 65296 AndAlso code <= 65305) Then
                       sb.Append(ChrW(code - 65248))
                   Else
                       sb.Append(c)
                   End If
                   previousWasSpace = False
               Else
                   sb.Append(c)
                   previousWasSpace = False
               End If
           Next

           ' 結果が一つのスペースのみの場合、空文字列を返します
           Dim result As String = sb.ToString().Trim()
           If result = " " Then
               Return ""
           End If

           Return result
       End Function

   End Class

方法2 将数据完成写入表格后,再将表格中所有数据遍历格式化,最后保存到excel文件

Imports System.Windows.Forms
Imports System.Data
Imports Microsoft.Data.SqlClient
Imports Microsoft.Office.Interop.Excel
                    ' シート単位で書き込み这个是将数据写到工作表的操作,最后工作表会写满数据,但是没有真正保存到excel文件中
                    writingReport(writeSheet, tempSheet)

                    Template.setBreakePage(writeSheet)

                    'ワークシート内のテキストを変換する
                    ProcessSheet(writeSheet)
                    '最后将数据写入excel表
                    writeBook.SaveAs(outputPath)
        ''' <summary>
        ''' ワークシートを処理する
        ''' データを処理する前にワークシート内のすべてのテキストを変換します
        ''' </summary>
        ''' <param name="sheet"></param>
        Public Shared Sub ProcessSheet(sheet As Worksheet)
            Dim usedRange As Range = sheet.UsedRange

            For Each cell As Range In usedRange
                If cell.Value IsNot Nothing AndAlso TypeOf cell.Value Is String Then
                    cell.Value = ConvertToHalfWidth(cell.Value.ToString())
                End If
            Next
        End Sub

        ''' 全角スペースを半角に変換
        ''' 複数のスペースも半角に変換されます
        ''' 英字を半角に変換し、その他の文字はそのまま
        Public Shared Function ConvertToHalfWidth(text As String) As String
            Dim sb As New System.Text.StringBuilder()
            Dim previousWasSpace As Boolean = False

            For Each c As Char In StrConv(text, VbStrConv.Wide)
                Dim code As Integer = AscW(c)

                ' 現在の文字が全角スペースか半角スペースかを確認します
                If code = 12288 OrElse code = 32 Then
                    ' 前の文字がスペースでない場合は半角スペースを追加
                    If Not previousWasSpace Then
                        sb.Append(ChrW(32))
                        previousWasSpace = True
                    End If
                ElseIf (code >= 65281 AndAlso code <= 65374) Then
                    ' 全角英文字および数字を半角に変換
                    If (code >= 65313 AndAlso code <= 65338) OrElse (code >= 65345 AndAlso code <= 65370) OrElse (code >= 65296 AndAlso code <= 65305) Then
                        sb.Append(ChrW(code - 65248))
                    Else
                        sb.Append(c)
                    End If
                    previousWasSpace = False
                Else
                    sb.Append(c)
                    previousWasSpace = False
                End If
            Next

            Return sb.ToString()
        End Function