# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > VB.NET >  باز کردن یک فایل excel در VB.net

## barbodsoft.com

سلام دوستان
من می خوام یک فایل اکسل رو با vb.net باز کنم دوستان اگه کدی یا مطلبی دارند بزارند.

من جستجو کردم ولی فقط یک کد پیدا کردم که اون فقط خود excel رو باز می کنه و خالی هست.

اشکال این کد چی هست

Dim xlsApp As Microsoft.Office.Interop.Excel.Application
Dim xlsWB As Microsoft.Office.Interop.Excel.Workbook
Dim xlsSheet As Microsoft.Office.Interop.Excel.Worksheet
Dim xlsCell As Microsoft.Office.Interop.Excel.Range
Dim xlsDatei AsString
xlsApp = New Microsoft.Office.Interop.Excel.Application
xlsApp.Visible = True
xlsWB = xlsApp.Workbooks.Open("C:\myexcel.xls")
xlsSheet = xlsWB.Worksheets(1)
xlsCell = xlsSheet.Range("A1")


اگه بتونم فایل اکسل رو تو فرم برنامه ام باز کنم که چه بهتر وگرنه صرفا باز شدن فایل هم خوبه.

----------


## sari-1369

این 2 تا تابع برای کار با فایل اکسل هستن .

پارامتر ورودیشون هم دستوری هستش که میخوای اعمال بشه . که کاملا شبیه دستور sql هستش .

    Public Function Ejra(ByVal str_program As String) As Boolean

        Dim str_path As String = "C:\DB.xls"
        Dim cn As OleDb.OleDbConnection
        Dim cmd As OleDb.OleDbCommand
        Try
            cn = New OleDb.OleDbConnection("provider=microsoft.jet.oled  b.4.0;" & _
            "data source=" + str_path + ";extended properties=excel 8.0;")
            cmd = New OleDb.OleDbCommand(str_program, cn)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
            Return True
        Catch ex As Exception
            cn.Close()
            Return False
        End Try
    End Function




مثال تابع اول :



Ejra("update [sheet1$] set akherin_khamoshi='" & txt_tarikh.Text & "' where radif=" & dgv.Rows(i).Cells("radif").Value)





Public Function bind(ByVal str_program As String) As DataTable

        Dim str_path As String = "C:\DB.xls"
        Dim cn As OleDb.OleDbConnection
        Dim cmd As OleDb.OleDbDataAdapter
        Dim dt As New Data.DataTable
        Try
            cn = New OleDb.OleDbConnection("provider=microsoft.jet.oled  b.4.0;" & _
            "data source=" + str_path + ";extended properties=excel 8.0;")
            cmd = New OleDb.OleDbDataAdapter(str_program, cn)
            cn.Open()
            cmd.Fill(dt)
            Return dt
            cn.Close()
        Catch ex As Exception
            cn.Close()
            Return dt
        End Try
    End Function




مثال این تابع :

 [dgv.DataSource = bind("select * from [sheet1$")

----------


## barbodsoft.com

دوست عزیز سلام
فکر می کنم اشتباه متوجه شدید.من نمی خوام صرفا دیتا رو ببینم (مثل کار کردن با sql نمی خوام) می خوام خود فایل excel باز بشه.



اون کدی که در اولین پست گذاشتم خطلای زیر رو می ده. حدث می زنم به خاطر ورژن کامپننت باشه. باید از چی استفاده کنم؟
Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

----------


## sari-1369

از کامپوننت خاصی استفاده نکردم .  :متفکر:   از خود کلاس های دات نت هستش .

فریمورکتون چنده ؟

فایل اکسلتون 2007  هستش یا 2003 ؟

----------


## Saman_12

باز شدن فایل کاری نداره شما با دادن آدرس Excel و بعد هم آدرس خود فایل به تابع Shell می تونید اونو باز کنید.(البته توی برنامه خودتون نه توی خود Excel.)

----------


## b.mahsa

> باز شدن فایل کاری نداره شما با دادن آدرس Excel و بعد هم آدرس خود فایل به تابع Shell می تونید اونو باز کنید.(البته توی برنامه خودتون نه توی خود Excel.)


دوست عزیز ایشون میخوان اطلاعات گرید رو تو excel بریزندو بازش کنند.


    Public Sub Export_to_Excel(ByVal ds As DataSet, ByVal fileName As String, ByVal Header_Gride() As String)

        Dim i As Integer
        Try
            Dim excelDoc As System.IO.StreamWriter

            excelDoc = New System.IO.StreamWriter(fileName)
            Const startExcelXML As String = "<xml version>" & vbCr & vbLf & "<Workbook " & "xmlns=""urn:schemas-microsoft-com:office:spreadsheet""" & vbCr & vbLf & " xmlns:o=""urn:schemas-microsoft-com:office:office""" & vbCr & vbLf & " " & "xmlns:x=""urn:schemas-    microsoft-com:office:" & "excel""" & vbCr & vbLf & " xmlns:ss=""urn:schemas-microsoft-com:" & "office:spreadsheet"">" & vbCr & vbLf & " <Styles>" & vbCr & vbLf & " " & "<Style ss:ID=""Default"" ss:Name=""Normal"">" & vbCr & vbLf & " " & "<Alignment ss:Vertical=""Bottom""/>" & vbCr & vbLf & " <Borders/>" & vbCr & vbLf & " <Font/>" & vbCr & vbLf & " <Interior/>" & vbCr & vbLf & " <NumberFormat/>" & vbCr & vbLf & " <Protection/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " " & "<Style ss:ID=""BoldColumn"">" & vbCr & vbLf & " <Font " & "x:Family=""Tahoma"" ss:Bold=""0""/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " " & "<Style     ss:ID=""StringLiteral"">" & vbCr & vbLf & " <NumberFormat" & " ss:Format=""@""/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " <Style " & "ss:ID=""Decimal"">" & vbCr & vbLf & " <NumberFormat " & "ss:Format=""0.0000""/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " " & "<Style ss:ID=""Integer"">" & vbCr & vbLf & " <NumberFormat " & "ss:Format=""0""/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " <Style " & "ss:ID=""DateLiteral"">" & vbCr & vbLf & " <NumberFormat " & "ss:Format=""mm/dd/yyyy;@""/>" & vbCr & vbLf & " </Style>" & vbCr & vbLf & " " & "</Styles>" & vbCr & vbLf & " "
            Const endExcelXML As String = "</Workbook>"
            Dim rowCount As Integer = 0
            Dim sheetCount As Integer = 1
            excelDoc.Write(startExcelXML)
            excelDoc.Write("<Worksheet ss:Name=""Sheet" & sheetCount & """>")
            excelDoc.Write("<Table>")
            excelDoc.Write("<Row>")
            For x As Integer = 0 To ds.Tables(0).Columns.Count - 1
                excelDoc.Write("<Cell ss:StyleID=""BoldColumn""><Data ss:Type=""String"">")
                excelDoc.Write(Header_Gride(x).ToString)
                excelDoc.Write("</Data></Cell>")
            Next
            excelDoc.Write("</Row>")
            'For i = 0 To Page_Counter - 1
            For Each x As DataRow In ds.Tables(i).Rows
                rowCount += 1
                If rowCount = 64000 Then
                    rowCount = 0
                    sheetCount += 1
                    excelDoc.Write("</Table>")
                    excelDoc.Write(" </Worksheet>")
                    excelDoc.Write("<Worksheet ss:Name=""Sheet" & sheetCount & """>")
                    excelDoc.Write("<Table>")
                End If
                excelDoc.Write("<Row>")
                'ID=" + rowCount + "
                For y As Integer = 0 To ds.Tables(i).Columns.Count - 1
                    Dim rowType As System.Type
                    rowType = x(y).[GetType]()
                    Select Case rowType.ToString()
                        Case "System.String"
                            Dim XMLstring As String = x(y).ToString()
                            XMLstring = XMLstring.Trim()
                            XMLstring = XMLstring.Replace("&", "&")
                            XMLstring = XMLstring.Replace(">", ">")
                            XMLstring = XMLstring.Replace("<", "<")
                            excelDoc.Write("<Cell ss:StyleID=""StringLiteral"">" & "<Data ss:Type=""String"">")
                            excelDoc.Write(XMLstring)
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case "System.DateTime"

                            Dim XMLDate As DateTime = DirectCast(x(y), DateTime)
                            Dim XMLDatetoString As String = ""
                            'Excel Converted Date
                            XMLDatetoString = XMLDate.Year.ToString() + "-" & (If(XMLDate.Month < 10, "0" + XMLDate.Month.ToString(), XMLDate.Month.ToString())) & "-" & (If(XMLDate.Day < 10, "0" + XMLDate.Day.ToString(), XMLDate.Day.ToString())) & "T" & (If(XMLDate.Hour < 10, "0" + XMLDate.Hour.ToString(), XMLDate.Hour.ToString())) & ":" & (If(XMLDate.Minute < 10, "0" + XMLDate.Minute.ToString(), XMLDate.Minute.ToString())) & ":" & (If(XMLDate.Second < 10, "0" + XMLDate.Second.ToString(), XMLDate.Second.ToString())) & ".000"
                            excelDoc.Write("<Cell ss:StyleID=""DateLiteral"">" & "<Data ss:Type=""DateTime"">")
                            excelDoc.Write(XMLDatetoString)
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case "System.Boolean"
                            excelDoc.Write("<Cell ss:StyleID=""StringLiteral"">" & "<Data ss:Type=""String"">")
                            excelDoc.Write(x(y).ToString())
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case "System.Int16", "System.Int32", "System.Int64", "System.Byte"
                            excelDoc.Write("<Cell ss:StyleID=""Integer"">" & "<Data ss:Type=""Number"">")
                            excelDoc.Write(x(y).ToString())
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case "System.Decimal", "System.Double"
                            excelDoc.Write("<Cell ss:StyleID=""Decimal"">" & "<Data ss:Type=""Number"">")
                            excelDoc.Write(x(y).ToString())
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case "System.DBNull"
                            excelDoc.Write("<Cell ss:StyleID=""StringLiteral"">" & "<Data ss:Type=""String"">")
                            excelDoc.Write("")
                            excelDoc.Write("</Data></Cell>")
                            Exit Select
                        Case Else
                            Throw (New Exception(rowType.ToString() & " not handled."))
                    End Select
                Next
                excelDoc.Write("</Row>")
            Next
            'Next

            excelDoc.Write("</Table>")
            excelDoc.Write(" </Worksheet>")
            excelDoc.Write(endExcelXML)
            excelDoc.Close()
            MsgBox(".ذخيره شد   " + fileName + "   اطلاعات در فايل ", MsgBoxStyle.Information, "")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

از این تابع استفاده کنید .

----------


## barbodsoft.com

> دوست عزیز ایشون میخوان اطلاعات گرید رو تو excel بریزندو بازش کنند.
> این لینک رو نگاه کنید.


تقریبا . ولی من نتونستم از کد شما استفاده کنم. البته برای باز کردن فایل اکسل هم چیزی ننوشتید.

سلام دوستان
من موفق شدم با تابع زیر اطلاعات دیتاتیبل رو در یک فایل اکسل ذخیره کنم و بلافاصله بعش باز کنم و کار بر بتونه ببینه. اما یک مشکل دیگه دارم و اونم اینه که چطور به ستون ها فرمت و مورد نظر رو بدم. مثلا فونت خاصی رو استفاده کنم و یا اندازه ستون ها رو عوض کنم.


 
PublicSub ExportExcel(ByVal Table As DataTable, ByVal Location AsString)
IfMy.Computer.FileSystem.FileExists(Location) ThenMy.Computer.FileSystem.DeleteFile(Location)
Dim CreateString AsString = ""
Dim Columns AsString = ""
Dim Mark AsString = ""
Using Connection AsNew OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Location & ";Extended Properties=""Excel 8.0;HDR=YES""")
Connection.Open()
CreateString = "CREATE TABLE [" & Table.TableName & "] ("
Columns = "("
Mark = "("
ForEach Column As DataColumn In Table.Columns
CreateString &= OS(Column.ColumnName)
SelectCase Column.DataType.Name
Case"SByte", "Byte", "Int16", "Int32", "Int64", "Decimal", "Double", "Single"
CreateString &= " Number, "
Case"Boolean"
CreateString &= " Bit, "
Case"Char", "String"
CreateString &= " Memo, "
Case"DateTime"
CreateString &= " DateTime, "
CaseElse
CreateString &= " Text, "
EndSelect
Columns &= OS(Column.ColumnName) & ", "
Mark &= "?,"
Next
CreateString = CreateString.Remove(CreateString.Length - 2, 2)
CreateString &= ")"
Columns = Columns.Remove(Columns.Length - 2, 2)
Columns &= ")"
Mark = Mark.Remove(Mark.Length - 1, 1)
Mark &= ")"
Using Command AsNew OleDb.OleDbCommand(CreateString.ToString, Connection)
Command.ExecuteNonQuery()
EndUsing
Using Adapter AsNew OleDb.OleDbDataAdapter("SELECT * FROM [" & Table.TableName & "$]", Connection)
Using ExcelDataset AsNew DataSet
Adapter.Fill(ExcelDataset, Table.TableName)
Adapter.InsertCommand = New OleDb.OleDbCommand("INSERT INTO [" & Table.TableName & "] " & Columns.ToString & " VALUES " & Mark.ToString, Connection)
ForEach Column As DataColumn In Table.Columns
SelectCase Column.DataType.Name
Case"SByte", "Byte", "Int16", "Int32", "Int64", "Decimal", "Double", "Single"
Adapter.InsertCommand.Parameters.Add("@" & OS(Column.ColumnName), OleDb.OleDbType.Numeric, 100, OS(Column.ColumnName))
Case"Boolean"
Adapter.InsertCommand.Parameters.Add("@" & OS(Column.ColumnName), OleDb.OleDbType.Boolean, 100, OS(Column.ColumnName))
Case"Char", "String"
Adapter.InsertCommand.Parameters.Add("@" & OS(Column.ColumnName), OleDb.OleDbType.Char, 65536, OS(Column.ColumnName))
Case"DateTime"
Adapter.InsertCommand.Parameters.Add("@" & OS(Column.ColumnName), OleDb.OleDbType.DBTimeStamp, 100, OS(Column.ColumnName))
CaseElse
Adapter.InsertCommand.Parameters.Add("@" & OS(Column.ColumnName), OleDb.OleDbType.Char, 65536, OS(Column.ColumnName))
EndSelect
Next
ForEach Row As DataRow In Table.Rows
If Row.RowState <> DataRowState.Deleted Then
Dim ExcelRow As DataRow = ExcelDataset.Tables(Table.TableName).NewRow
For i AsInteger = 0 To Table.Columns.Count - 1
ExcelRow.Item(i) = Row.Item(i)
Next
ExcelDataset.Tables(Table.TableName).Rows.Add(Exce  lRow)
EndIf
Next
Adapter.Update(ExcelDataset, Table.TableName)
EndUsing
EndUsing
EndUsing
 
If MessageBoxFa.Show("فایل اکسل ایجاد شد. آیا می خواهید فایل را همکنون ببینید؟", name_me, MessageBoxButtons.YesNo) = DialogResult.Yes Then
Dim oApp AsNew Microsoft.Office.Interop.Excel.Application()
oApp.Visible = True
oApp.UserControl = True
Dim oldCI As System.Globalization.CultureInfo = _
System.Threading.Thread.CurrentThread.CurrentCultu  re
System.Threading.Thread.CurrentThread.CurrentCultu  re = _
New System.Globalization.CultureInfo("en-US")
oApp.Workbooks.Add(Location)
System.Threading.Thread.CurrentThread.CurrentCultu  re = oldCI
EndIf
EndSub

----------

