2008-11-25 75 views
47

我在Excel中有一堆行,我想粘貼到MS SQL中的新表中。有一個簡單的方法嗎?將MS Excel數據粘貼到SQL Server中

+0

這似乎並沒有被編程相關的 - 你想用VBA做到這一點或者其他的東西? – warren 2008-11-25 10:59:40

+0

不,只是大量的數據到達excel或容易,'excellable' – Bajji 2008-11-25 12:46:22

+0

這http://dotnetstories.wordpress.com/2008/05/24/copy-paste-data-from-excel-to-sql- server-2005 /爲我工作 – 2011-07-01 09:14:53

回答

29

我在過去成功地使用這種技術:

Using Excel to generate Inserts for SQL Server

(...)跳過一列(或使用它的註釋),然後鍵入類似 以下公式是:

="insert into tblyourtablename (yourkeyID_pk, intmine, strval) values ("&A4&", "&B4&", N'"&C4&"')"

現在,你有你的插入語句 包含主鍵(PK),整數和Unicode字符串的表。 (...)

+1

bzlm的回答更適合這個問題。這是一個簡潔的小發現,但大多數情況下,bzlm的右鍵單擊並複製過去的作品! – ThinkCode 2014-01-23 18:19:52

2

最簡單的方法是在XLS中創建一個可生成插入語句語法的計算列。 然後將這些插入內容複製到文本文件中,然後在SQL上執行。 其他的選擇是購買Excel的數據庫連接附件,並編寫VBA代碼來完成相同的操作。

0

如果接口的工作方式與上次一樣,我可以使用它,您可以在Excel中選擇區域,複製它,打開SQL Server並將數據粘貼到表格中,就像使用Access一樣。

或者您可以在Excel和SQL Server之間設置ODBC鏈接。

1

我想一些數據庫可以從CSV(逗號分隔值)文件導入數據,你可以從exel導出。或者至少使用csv解析器很容易(找到一種適合你的語言,不要試圖自己創建一個 - 比看起來更難)將它導入數據庫。

我對MS SQL並不熟悉,但如果它直接支持MS SQL,我不會感到驚訝。

在任何情況下,我認爲必須要求Exel表單和數據庫表中的結構相似。

-1

爲什麼不只是在SSMS中使用導出/導入嚮導?

50

如果您擁有SQL Server Management Studio,則可以使用鼠標將其從Excel和Paste複製到Management Studio中的表中。只需

  1. 轉到您想要粘貼的表格。
  2. 選擇「編輯排行200行」。
  3. 右鍵單擊任意位置並選擇粘貼。

在執行此操作之前,您必須匹配Excel和Management Studio之間的列。另外,您必須使用Management Studio中的表設計器放置任何不可編輯的列上一個(最右側)。

整個過程需要幾秒鐘(到設置和啓動 - 不一定要執行),並且不需要任何SQL語句。

-1

難道你不能使用VBA代碼從Excel中複製並粘貼到SSMS操作中嗎?

13

以備將來參考:

您可以通過這樣做,從連接Excel工作表複製粘貼數據到SQL表:

在Excel中選擇,然後按Ctrl + C

    數據
  1. 在Excel中選擇數據,按按Ctrl + C
  2. 在SQL Server Management Studio中右鍵單擊該表並選擇編輯前200行
  3. 滾動至底部,並通過點擊列標題選擇整個空行
  4. Ctrl + V鍵

注意粘貼數據:通常的表具有第一列,其是一個帶有自動生成/增加ID的ID列。粘貼數據時,它將開始將Excel中最左側的選定列插入SSMS中最左側的列,從而將數據插入到ID列中。爲了避免在選擇的最左邊部分保留一個空列,以便跳過SSMS中的該列。這將導致SSMS插入默認數據,即自動生成的ID。 此外,您可以跳過其他列,方法是在Excel工作表選擇的相同序數位置處將空列標記爲要跳過的列。這將使SSMS插入默認值(或NULL,其中沒有指定默認值)。

0

我開發了一個Excel VBA宏,用於將任何選擇從Excel中剪切並粘貼到SQL Server中,創建一個新表。這個宏非常適合快速和骯髒的表格創作,最多可以有幾千行和多列(理論上可以管理多達200列)。該宏嘗試自動檢測標題名稱併爲每個列指定最合適的數據類型(它處理最多1000個字符的varchar列)。

推薦的設置步驟:

  1. 確保Excel中啓用運行宏。 (文件 - >選項 - >信任中心 - >信任中心設置 - >宏設置 - >啓用所有宏..)
  2. 將VBA代碼複製到與您的個人工作簿相關聯的模塊(以便宏可用所有工作表)
  3. 分配適當的擊鍵宏(我已經指定Ctrl鍵Shift鍵X)
  4. 保存您的個人工作簿

利用宏觀

  1. 在Excel中選擇單元格(包括專欄他aders,如果它們存在)將被轉移到SQL
  2. 按分配的關鍵字組合來運行宏
  3. 按照提示進行操作。 (默認表名是##表)
  4. 將剪貼板內容粘貼到SSMS窗口並運行生成的SQL代碼。 BriFri 238

VBA代碼:

Sub TransferToSQL() 
' 
' TransferToSQL Macro 
' This macro prepares data for pasting into SQL Server and posts it to the clipboard for inserting into SSMS 
' It attempts to automatically detect header rows and does a basic analysis of the first 15 rows to determine the most appropriate datatype to use handling text entries upto 1000 chars. 
' 
' Max Number of Columns: 200 
' 
' Keyboard Shortcut: Ctrl+Shift+X 
' 
' ver Date Reason 
' === ==== ====== 

' 1.6 06/2012 Fixed bug that prevented auto exit if no selection made/auto exit if blank Tablename entered or 'cancel' button pressed 
' 1.5 02/2012 made use of function fn_ColLetter to retrieve the Column Letter for a specified column 
' 1.4 02/2012 Replaces any Tabs in text data to spaces to prevent Double quotes being output in final results 
' 1.3 02/2012 Place the 'drop table if already exists' code into a separate batch to prevent errors when inserting new table with same name but different shape and > 100 rows 
' 1.2 01/2012 If null dates encountered code to cast it as Null rather than '00-Jan-1900' 
' 1.1 10/2011 Code to drop the table if already exists 
' 1.0 03/2011 Created 

Dim intLastRow As Long 
Dim intlastColumn As Integer 
Dim intRow As Long 
Dim intDataStartRow As Long 
Dim intColumn As Integer 
Dim strKeyWord As String 
Dim intPos As Integer 
Dim strDataTypeLevel(4) As String 
Dim strColumnHeader(200) As String 
Dim strDataType(200) As String 
Dim intRowCheck As Integer 
Dim strFormula(20) As String 
Dim intHasHeaderRow As Integer 
Dim strCellRef As String 
Dim intFormulaCount As Integer 
Dim strSQLTableName As String 
Dim strSQLTableName_Encap As String 
Dim intdataTypelevel As Integer 
Const strConstHeaderKeyword As String = "ID,URN,name,Title,Job,Company,Contact,Address,Post,Town,Email,Tele,phone,Area,Region,Business,Total,Month,Week,Year," 
Const intConstMaxBatchSize As Integer = 100 
    Const intConstNumberRowsToAnalyse As Integer = 100 
intHasHeaderRow = 0 

strDataTypeLevel(1) = "VARCHAR(1000)" 
strDataTypeLevel(2) = "FLOAT" 
strDataTypeLevel(3) = "INTEGER" 
strDataTypeLevel(4) = "DATETIME" 



' Use current selection and paste to new temp worksheet 

    Selection.Copy 
    Workbooks.Add  ' add temp 'Working' Workbook 
    ' Paste "Values Only" back into new temp workbook 
    Range("A3").Select ' Goto 3rd Row 
    Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Copy Format of Selection 
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Copy Values of Selection 
    ActiveCell.SpecialCells(xlLastCell).Select ' Goto last cell 
    intLastRow = ActiveCell.Row 
    intlastColumn = ActiveCell.Column 


' Check to make sure that there are cells which are selected 
If intLastRow = 3 And intlastColumn = 1 Then 
    Application.DisplayAlerts = False  ' Temporarily switch off Display Alerts 
    ActiveWindow.Close      ' Delete newly created worksheet 
    Application.DisplayAlerts = True  ' Switch display alerts back on 
    MsgBox "*** Please Make selection before running macro - Terminating ***", vbOKOnly, "Transfer Data to SQL Server" 
    Exit Sub 
End If 

' Prompt user for Name of SQL Server table 
strSQLTableName = InputBox("SQL Server Table Name?", "Transfer Excel Data To SQL", "##Table") 

' if blank table name entered or 'Cancel' selected then exit 
If strSQLTableName = "" Then 
    Application.DisplayAlerts = False  ' Temporarily switch off Display Alerts 
    ActiveWindow.Close      ' Delete newly created worksheet 
    Application.DisplayAlerts = True  ' Switch display alerts back on 
    Exit Sub 
End If 



' encapsulate tablename with square brackets if user has not already done so 
strSQLTableName_Encap = Replace(Replace(Replace("[" & Replace(strSQLTableName, ".", "].[") & "]", "[]", ""), "[[", "["), "]]", "]") 

' Try to determine if the First Row is a header row or contains data and if a header load names of Columns 
Range("A3").Select 
For intColumn = 1 To intlastColumn 
    ' first check to see if the first row contains any pure numbers or pure dates 
    If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then 
    intHasHeaderRow = vbNo 
    intDataStartRow = 3 
    Exit For 
    Else 
    strColumnHeader(intColumn) = ActiveCell.Value 
    ActiveCell.Offset(1, 0).Range("A1").Select ' go to the row below 
    If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then 
     intHasHeaderRow = vbYes 
     intDataStartRow = 4 
    End If 
    ActiveCell.Offset(-1, 0).Range("A1").Select ' go back up to the first row 
    If intHasHeaderRow = 0 Then  ' if still not determined if header exists: Look for header using keywords 
     intPos = 1 
     While intPos < Len(strConstHeaderKeyword) And intHasHeaderRow = 0 
     strKeyWord = Mid$(strConstHeaderKeyword, intPos, InStr(intPos, strConstHeaderKeyword, ",") - intPos) 
     If InStr(1, ActiveCell.Value, strKeyWord) > 0 Then 
      intHasHeaderRow = vbYes 
      intDataStartRow = 4 
     End If 
     intPos = InStr(intPos, strConstHeaderKeyword, ",") + 1 
     Wend 
    End If 
    End If 
    ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column 
Next intColumn 

' If auto header row detection has failed ask the user to manually select 
If intHasHeaderRow = 0 Then 
    intHasHeaderRow = MsgBox("Does current selection have a header row?", vbYesNo, "Auto header row detection failure") 
    If intHasHeaderRow = vbYes Then 
    intDataStartRow = 4 
    Else 
    intDataStartRow = 3 
    End If 

End If 




' *** Determine the Data Type of each Column *** 

' Go thru each Column to find Data types 
If intLastRow < intConstNumberRowsToAnalyse Then    ' Check the first intConstNumberRowsToAnalyse rows or to end of selection whichever is less 
    intRowCheck = intLastRow 
Else 
    intRowCheck = intConstNumberRowsToAnalyse 
End If 

For intColumn = 1 To intlastColumn 
    intdataTypelevel = 5 

    For intRow = intDataStartRow To intRowCheck 
    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intColumn) 
    If ActiveCell.Value = "" Then ' ignore blank (null) values 
    ElseIf IsDate(ActiveCell.Value) = True And Len(ActiveCell.Value) >= 8 Then 
     If intdataTypelevel > 4 Then intdataTypelevel = 4 
    ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") = 0 And (Left(CStr(ActiveCell.Value), 1) <> "0" Or ActiveCell.Value = "0") And Len(ActiveCell.Value) < 10 Then 
     If intdataTypelevel > 3 Then intdataTypelevel = 3 
    ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") >= 1 Then 
     If intdataTypelevel > 2 Then intdataTypelevel = 2 
    Else 
     intdataTypelevel = 1 
     Exit For 
    End If 
    Next intRow 
    If intdataTypelevel = 5 Then intdataTypelevel = 1 
    strDataType(intColumn) = strDataTypeLevel(intdataTypelevel) 
Next intColumn 


' *** Build up the SQL 
intFormulaCount = 1 
If intHasHeaderRow = vbYes Then  ' *** Header Row *** 
    Application.Goto Reference:="R4" & "C" & CStr(intlastColumn + 1) ' Goto next column in first data row of selection 
    strFormula(intFormulaCount) = "= ""SELECT " 
    For intColumn = 1 To intlastColumn 
    If strDataType(intColumn) = "DATETIME" Then   ' Code to take Excel Dates back to text 
     strCellRef = "Text(" & fn_ColLetter(intColumn) & "4,""dd-mmm-yyyy hh:mm:ss"")" 
    ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then 
     strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "4,""'"",""''"")" ' Convert any single ' to double '' 
    Else 
     strCellRef = fn_ColLetter(intColumn) & "4" 
    End If 


    strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [" & strColumnHeader(intColumn) & "]" 
    If intColumn < intlastColumn Then 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", " 
    Else 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """ 
    End If 
    ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell 
    If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + """" 
     intFormulaCount = intFormulaCount + 1 
     strFormula(intFormulaCount) = "= """ 
    End If 
    Next intColumn 

' Assign the formula to the cell(s) just right of the selection 
    For intColumn = 1 To intFormulaCount 
    ActiveCell.Value = strFormula(intColumn) 
    If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column 
    Next intColumn 


' Auto Fill the formula for the full length of the selection 
    ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select 
    If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "4:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault 

' Go to start row of data selection to add 'Select into' code 
    ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value 

' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch 
    ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above 
    ActiveCell.Value = "GO" 
    ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above 
    If Left(strSQLTableName, 1) = "#" Then  ' temp table 
     ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap 
    Else 
     ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap 
    End If 



' For Big selections (i.e. several 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts 
    intRow = intConstMaxBatchSize + 4 ' add 4 to make sure 1st batch = Max Batch Size 
    While intRow < intLastRow 
    Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount) ' Goto Row before intRow and the last column in formula selection 
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", ") a") ' Remove last 'UNION ALL' 

    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1) ' Goto intRow and the first column in formula selection 
    ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value 
    intRow = intRow + intConstMaxBatchSize ' increment intRow by intConstMaxBatchSize 
    Wend 


    ' Delete the last 'UNION AlL' replacing it with brackets to mark the end of the last insert 
    Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount) 
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", ") a") 

    ' Select all the formula cells 
    ActiveCell.Offset(-intLastRow + 2, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow - 1)).Select 
Else ' *** No Header Row *** 
    Application.Goto Reference:="R3" & "C" & CStr(intlastColumn + 1) ' Goto next column in first data row of selection 
    strFormula(intFormulaCount) = "= ""SELECT " 

    For intColumn = 1 To intlastColumn 
    If strDataType(intColumn) = "DATETIME" Then 
     strCellRef = "Text(" & fn_ColLetter(intColumn) & "3,""dd-mmm-yyyy hh:mm:ss"")" ' Format Excel dates into a text Date format that SQL will pick up 
    ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then 
     strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "3,""'"",""''"")"   ' Change all single ' to double '' 
    Else 
     strCellRef = fn_ColLetter(intColumn) & "3" 
    End If 

    ' Since no column headers: Name each column "Column001",Column002".. 
    strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [Column" & CStr(intColumn) & "]" 
    If intColumn < intlastColumn Then 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", " 
    Else 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """ 
    End If 

    ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell 
    If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then 
     strFormula(intFormulaCount) = strFormula(intFormulaCount) + """" 
     intFormulaCount = intFormulaCount + 1 
     strFormula(intFormulaCount) = "= """ 
    End If 
    Next intColumn 

    ' Assign the formula to the cell(s) just right of the selection 
    For intColumn = 1 To intFormulaCount 
    ActiveCell.Value = strFormula(intColumn) 
    If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column 
    Next intColumn 

' Auto Fill the formula for the full length of the selection 
    ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select 
    If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "3:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault 

' Go to start row of data selection to add 'Select into' code 
    ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value 

' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch 
    ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above 
    ActiveCell.Value = "GO" 
    ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above 
    If Left(strSQLTableName, 1) = "#" Then  ' temp table 
     ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap 
    Else 
     ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap 
    End If 

    ' For Big selections (i.e. serveral 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts 
    intRow = intConstMaxBatchSize + 3  ' add 3 to make sure 1st batch = Max Batch Size 
    While intRow < intLastRow 
    Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount) ' Goto Row before intRow and the last column in formula selection 
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", ") a") ' Remove last 'UNION ALL' 

    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1) ' Goto intRow and the first column in formula selection 
    ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value 
    intRow = intRow + intConstMaxBatchSize ' increment intRow by intConstMaxBatchSize 
    Wend 

    ' Delete the last 'UNION AlL' 
    Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount) 
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", ") a") 

    ' Select all the formula cells 
    ActiveCell.Offset(-intLastRow + 1, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow)).Select 
End If 


' Final Selection to clipboard and Cleaning of data 
Selection.Copy 
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False    ' Repaste "Values Only" back into cells 
Selection.Replace What:="CAST('' AS", Replacement:="CAST(NULL AS", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all blank cells to NULL 
Selection.Replace What:="'00-Jan-1900 00:00:00'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all blank Date cells to NULL 
Selection.Replace What:="'NULL'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all 'NULL' cells to NULL 
Selection.Replace What:=vbTab, Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False  ' Replace all Tabs in cells to Space to prevent Double Quotes occuring in the final paste text 
Selection.Copy 


MsgBox "SQL Code has been added to clipboard - Please Paste into SSMS window", vbOKOnly, "Transfer to SQL" 

Application.DisplayAlerts = False  ' Temporarily switch off Display Alerts 
ActiveWindow.Close      ' Delete newly created worksheet 
Application.DisplayAlerts = True  ' Switch display alerts back on 



End Sub 




Function fn_ColLetter(Col As Integer) As String 

Dim strColLetter As String 

If Col > 26 Then 
    ' double letter columns 
    strColLetter = Chr(Int((Col - 1)/26) + 64) & _ 
     Chr(((Col - 1) Mod 26) + 65) 
Else 
    ' single letter columns 
    strColLetter = Chr(Col + 64) 
End If 
fn_ColLetter = strColLetter 
End Function 
2

Excel中

  1. 在Excel中,突出顯示並複製要粘貼到SQL數據。

SQL

  • 創建與所需的列名的表,給你表的名稱。 *確保Identity Specification爲「是」,因此它會自動增加您的 標識列。
  • 找到您的表格,並右鍵單擊它並從對話框中選擇Edit Top 200 Rows
  • 右鍵單擊空行與*符號,並從對話框框選擇粘貼
  • enter image description here

    相關問題