2017-01-09 7 views
-3

enter image description hereenter image description here Я просто изучаю VB.NET и, к сожалению, мне поручено что-то, о чем я не знаю, как это сделать.CSV to XLSX VB.NET

Мне нужно создать быстрое приложение на основе окон для экспорта файлов csv в файл XLSX.

Да, я знаю, что другие сообщения могут иметь похожую тему, однако эта, я считаю, уникальна.

Файл CSV будет содержать 5 заголовков, «Линия», «Компонент», «Выбрано», «Размещено» и «Пропущено». У нас есть номера деталей в столбце 2, которые будут помещены в компонент. Я понимаю из полномочий, которые есть, этот файл суммирует полные номера деталей, то есть 0-5490045 и линию JUKI 3, и итоговые суммы, выбранные, размещенные и пропущенные. Я привел примеры строк ниже. Первая строка - это формат csv, второй - вывод. Я не уверен, какой цикл был бы лучшим циклом FOR, циклом WHILE и т. Д. Я предполагаю, что мне понадобится какой-то цикл, чтобы получить все данные в файле csv. Единственный код, который у меня есть, открывает диалоговое окно и позволяет выбрать файл и попытаться прочитать в datatable. Я пытаюсь получить эту работу, а затем реструктурировать некоторый код.

Imports Spire.Xls 
Imports System.Windows.Forms 
Imports System.Data 

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim dialog As OpenFileDialog = New OpenFileDialog 
     dialog.Filter="CSV document(*.csv)|*.csv" 
     Dim result As DialogResult = dialog.ShowDialog 
     If(result=DialogResult.OK) Then 
      Dim csvFile As String = dialog.FileName 
      Dim workbook As Workbook = New Workbook 
      workbook.LoadFromFile(csvFile,",") 
      Dim worksheet As Worksheet = workbook.Worksheets(0) 
      Dim dt As DataTable=worksheet.ExportDataTable 

      Me.dataGridView1.DataSource=dt 
     End If 
    End Sub 


End Class 



    JUKI 3 0-5490045 96 96 3 

    Line Component Picked Placed Missed 
    JUKI 3 0-5490045 99 96 3 
+0

Вы на самом деле не описано, что вы уже пробовали или где вы застряли. Что конкретно ваш вопрос? Если вы просто спрашиваете, как создать файл Excel в .NET, для этого есть библиотеки/учебные пособия/примеры в Интернете. – David

+0

Я искал и не нашел хорошего. e-iceblue выглядит нормально. Это действительно сумасшествие, все, что нужно, - это взять CSV-файл, суммировать значения в столбцах 1-5 на основе номера детали и показать его в формате данных. и экспортировать его как xls. – TAdams79

+1

Я бы предложил вам разделить проблему на более мелкие и исследовать каждый, а затем задать конкретный вопрос о более мелкой проблеме. Например, можете ли вы открыть файл? Можете ли вы прочитать файл? Можете ли вы читать csv? Можете ли вы сохранить содержимое csv? Можете ли вы прочитать этот сохраненный контент? ... –

ответ

0

Если вы пытаетесь достичь, как импортировать данные в DataTable ниже это быстрый способ обработки этого. Это приведет к тому, что весь ваш csv будет занесен в datatable, и вы сможете выполнить логику и создать свой xlsx-файл.

Friend Shared Function GetExcelFile(ByVal strFileName As String, ByVal strPath As String) As DataTable 

Try 

    Dim dt As New DataTable 

     Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & ";Extended Properties=""Text;HDR=Yes;FMT=Delimited\""" 
     Dim conn As New OleDb.OleDbConnection(ConStr) 
     Dim da As New OleDb.OleDbDataAdapter("Select * from " & strFileName, conn) 
     da.Fill(dt) 

    Return dt 

Catch ex As Exception 
    Return Nothing 
End Try 

End Function 
+0

Итак, после импорта я могу программно суммировать различные значения столбцов? Как можно обрабатывать данные, например, в первой строке? Это было бы намного проще, если бы глупая машина не добавляла все неиспользованное дерьмо. – TAdams79

+0

Вы могли бы. Я бы попросил Спрос об этом в другом вопросе. Но в качестве примера для получения отдельных значений вы можете делать данные: tbl.AsDataView.ToTable (True, «Your Column»). Rows.Count – CodeMonger

+0

JohnG - имеет хорошую точку. Если единственное, что вы делаете, это поместить файл csv в файл xlsx. – CodeMonger

1

Ненавижу делать предложение, а не показывать, как оно будет работать. Ниже приведен пример использования настраиваемого объекта с именем Machine для хранения данных. Этот класс является минимальным для объекта и используется только в качестве примера, чтобы вы начали. В нем есть несколько полей, которые пригодится при переходе по списку для выполнения ваших вычислений. Здесь вы также можете добавить некоторые пользовательские функции/подпрограммы, чтобы помочь в какой-то задаче, которая включает объекты «Machine». Также здесь вы можете добавить некоторые функции сравнения, которые позволят вам сортировать между прочим. После того, как вы положите все это вместе, вы должны составить список действительных объектов Machine.

Это список, который вы могли бы использовать, чтобы помочь вам перейти к вычислению/удалению дубликатов части вашей задачи. В процессе вычисления данных вы можете создать окончательный список объектов Machine, которые вы могли бы использовать для экспорта в Excel с заголовками или отображения его в DataGridView. Надеюсь это поможет.

машина класса

Public Class Machine 
    Private name As String 
    Private partNumber As String 
    Private inventoryIn As Integer 
    Private inventoryOut As Integer 
    Private inventoryMissing As Integer 

    Public Sub New(inName As String, inPartNum As String, inInvIn As Integer, inInvOut As Integer, InInvMis As Integer) 
    name = inName 
    partNumber = inPartNum 
    inventoryIn = inInvIn 
    inventoryOut = inInvOut 
    inventoryMissing = InInvMis 
    End Sub 

    Property GetName As String 
    Get 
     Return name 
    End Get 
    Set(value As String) 
     name = value 
    End Set 
    End Property 

    Public Overrides Function ToString() As String 
    Return "Name: " + name + " #: " + partNumber + vbTab + " In:" + inventoryIn.ToString() + " Out:" + inventoryOut.ToString() + " Miss:" + inventoryMissing.ToString() 
    End Function 
End Class 

Теперь к вашему вопросу чтения файла

Я ничего с участием первенствует не использовать. Так как у вас есть простой файл csv, мы будем его использовать. Также мы будем использовать класс Machine. Используя диалоговое окно открытого файла, мы получаем имя файла для чтения. Переменная partsList создана для хранения объектов Machine, созданных при чтении файла. Затем цикл for each проходит через список и отображает результаты в текстовом поле формы.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim dialog As OpenFileDialog = New OpenFileDialog 
    dialog.Filter = "CSV document(*.csv)|*.csv" 
    Dim result As DialogResult = dialog.ShowDialog 
    If (result = DialogResult.OK) Then 
    Dim csvFile As String = dialog.FileName 
    Dim partsList As List(Of Machine) = ReadText(csvFile) 
    For Each curMac As Machine In partsList 
     TextBox1.AppendText(curMac.ToString() + Environment.NewLine) 
    Next 
    End If 
End Sub 

Функция для чтения файла CSV

Private Function ReadText(filePath As String) As List(Of Machine) 
    Dim fileReader As System.IO.StreamReader 
    Dim data As List(Of Machine) = New List(Of Machine) 
    fileReader = My.Computer.FileSystem.OpenTextFileReader(filePath) 
    Dim curline As String = "" 
    While (Not curline Is Nothing) 
    curline = fileReader.ReadLine() 
    '' need to check for valid data 
    '' if anything is invalid simply ignore it... i.e. your bad rows 
    '' keep in mind this will also ignore good rows that have a single piece of data bad 
    If (StringOK(curline)) Then 
     Dim newMac = GetMac(curline) 
     data.Add(newMac) 
    End If 
    End While 
    Return data 
End Function 

Несколько вспомогательных функций для проверки данных

Private Function StringOK(inString As String) As Boolean 
    If (String.IsNullOrEmpty(inString)) Then 
    Return False 
    End If 
    Dim splitArray() As String = inString.Split(",") 
    Try 
    If ((String.IsNullOrEmpty(splitArray(0))) Or (String.IsNullOrEmpty(splitArray(1)))) Then 
     Return False 
    End If 
    Dim value As Integer 
    If ((Not Integer.TryParse(splitArray(2), value)) Or 
     (Not Integer.TryParse(splitArray(3), value)) Or 
     (Not Integer.TryParse(splitArray(4), value))) Then 
     Return False 
    End If 
    Return True 
    Catch ex As Exception 
    Return False 
    End Try 
End Function 

Function GetMac(inString As String) As Machine 
    Dim splitArray() As String = inString.Split(",") 
    Dim value As Integer 
    Dim name As String = splitArray(0) 
    Dim number As String = splitArray(1) 
    Integer.TryParse(splitArray(2), value) 
    Dim invIn As Integer = value 
    Integer.TryParse(splitArray(3), value) 
    Dim invOut As Integer = value 
    Integer.TryParse(splitArray(4), value) 
    Dim invMis As Integer = value 
    Return New Machine(name, number, invIn, invOut, invMis) 
End Function