Как переименовать файл после экспорта из последовательного имени файла на основе таблицы данных выражения в VB.NET

Я пытаюсь переименовать изображение файла после экспорта с таблицей данных в VB.NET.

Я использую библиотеку управления LabelControl для .NET от BaiqiSoft.

Я также обратился в службу поддержки Baiqisoft, и тогда он ответил: «Таково поведение нашего продукта». поэтому результаты имени файла экспорта из библиотеки являются последовательными. Есть ли решение, которое я могу переименовать после изображения экспорта, а также без ошибок переименовать имя файла на основе таблицы данных выражения? или другой метод?

Пожалуйста, направь меня

Более подробную документацию можно найти по ссылке ниже.

https://www.mysofttool.com/help/labeldesign/

Imports System.IO
Imports BaiqiSoft.LabelControl
Public Class Form1
    Private m_DataTable As DataTable
    Private Sub CreateDataTable()
        If m_DataTable IsNot Nothing Then Return
        m_DataTable = New DataTable
        'Columns
        m_DataTable.Columns.Add("ProductName", GetType(String))
        m_DataTable.Columns.Add("Barcode", GetType(String))
        m_DataTable.Columns.Add("Price", GetType(Single))
        m_DataTable.Columns.Add("LabelNumber", GetType(Integer))
        m_DataTable.Columns.Add("QTY", GetType(Integer))
        m_DataTable.Columns.Add("Filename", GetType(String), "ProductName +','+ Barcode")
        'Rows
        m_DataTable.Rows.Add("Mishi Kobe Niku", "845723054943", 96.0, 2, 1)
        m_DataTable.Rows.Add("Carnarvon Tigers", "246321456231", 61.5, 1, 1)
        m_DataTable.Rows.Add("Ipoh Coffee", "589412354786", 46.0, 3, 1)
        m_DataTable.Rows.Add("Aniseed Syrup", "457125463254", 10.0, 1, 1)
        m_DataTable.Rows.Add("Teatime Chocolate Biscuits", "232145674321", 9.2, 5, 1)
    End Sub
Private Sub Btnexport_Click(sender As Object, e As EventArgs) Handles Btnexport.Click
        Dim theLabel As New LabelPrinting()
        theLabel.LicenseKey = ""
        theLabel.OpenLabel(Application.StartupPath & "\test.blf")
        Dim selectedRows As DataTable = m_DataTable.Clone
        selectedRows.Columns("Filename").Expression = Nothing : selectedRows.Columns("Filename").ReadOnly = False
        For Each row2 As DataGridViewRow In DataGridView1.Rows
            Dim isselect As Boolean = Convert.ToBoolean(row2.Cells("checkboxcolumn").Value)
            If isselect Then
                Dim newRow As DataRow = selectedRows.NewRow()
                newRow("ProductName") = m_DataTable.Rows(row2.Index)("ProductName")
                newRow("Barcode") = m_DataTable.Rows(row2.Index)("Barcode")
                newRow("Price") = m_DataTable.Rows(row2.Index)("Price")
                newRow("LabelNumber") = m_DataTable.Rows(row2.Index)("LabelNumber")
                newRow("QTY") = m_DataTable.Rows(row2.Index)("QTY")
                newRow("Filename") = m_DataTable.Rows(row2.Index)("ProductName") + "," + m_DataTable.Rows(row2.Index)("Barcode") + ".png"
                selectedRows.Rows.Add(newRow)
                theLabel.Label.QuantityColumn = "QTY"
            End If
        Next row2
        theLabel.DataSource = selectedRows
        theLabel.ExportOptions.FileName = "test"
        theLabel.ExportOptions.Path = Application.StartupPath
        theLabel.ExportOptions.Quantity = QuantityOptions.AllRecords
        theLabel.ExportOptions.Format = ImageFormats.Png
        theLabel.ExportOptions.Resolution = 300
        theLabel.ExportImage()
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CreateDataTable()
        DataGridView1.DataSource = m_DataTable
        Dim CheckedBoxColumn As New DataGridViewCheckBoxColumn
        CheckedBoxColumn.Width = 40
        CheckedBoxColumn.Name = "checkboxcolumn"
        CheckedBoxColumn.HeaderText = "Check"
        DataGridView1.Columns.Insert(0, CheckedBoxColumn)
    End Sub
End Class

Результат из кода:

test1.png

test2.png

test3.png

test4.png

test5.png

Должно быть так (желаемый результат):

Mishi Kobe Niku,845723054943.png
 
Carnarvon Tigers,246321456231.png
 
Ipoh Coffee,589412354786.png
 
Aniseed Syrup,457125463254.png
 
Teatime Chocolate Biscuits,232145674321.png

Можно ли переименовать вот так

test1.png >>>> Mishi Kobe Niku,845723054943.png

test2.png >>>> Carnarvon Tigers,246321456231.png

test3.png >>>> Ipoh Coffee,589412354786.png

test4.png >>>> Aniseed Syrup,457125463254.png

test5.png >>>> Teatime Chocolate Biscuits,232145674321.png

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После этого вы сможете переименовать файлы, просто сопоставьте исходное имя с желаемым новым именем, например, в Dictionary(Of String, String):

Private Sub Btnexport_Click(sender As Object, e As EventArgs) Handles Btnexport.Click
    Dim theLabel As New LabelPrinting()
    theLabel.LicenseKey = ""
    theLabel.OpenLabel(Application.StartupPath & "\test.blf")
    Dim selectedRows As DataTable = m_DataTable.Clone
    selectedRows.Columns("Filename").Expression = Nothing : selectedRows.Columns("Filename").ReadOnly = False
    
    Dim fileNameMapper = New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)
    Dim fileCounter As Int32 = 0
    Dim fileName = "test"

    For Each row2 As DataGridViewRow In DataGridView1.Rows
        Dim isselect As Boolean = Convert.ToBoolean(row2.Cells("checkboxcolumn").Value)
        If isselect Then
            Dim newRow As DataRow = selectedRows.NewRow()
            newRow("ProductName") = m_DataTable.Rows(row2.Index)("ProductName")
            newRow("Barcode") = m_DataTable.Rows(row2.Index)("Barcode")
            newRow("Price") = m_DataTable.Rows(row2.Index)("Price")
            newRow("LabelNumber") = m_DataTable.Rows(row2.Index)("LabelNumber")
            newRow("QTY") = m_DataTable.Rows(row2.Index)("QTY")
            newRow("Filename") = m_DataTable.Rows(row2.Index)("ProductName") + "," + m_DataTable.Rows(row2.Index)("Barcode") + ".png"
            selectedRows.Rows.Add(newRow)
            theLabel.Label.QuantityColumn = "QTY"

            fileCounter += 1 
            Dim originalName = $"{fileName}{fileCounter}.png"
            fileNameMapper.Add(originalName, newRow.Field(Of String)("Filename"))
        End If
    Next row2
    theLabel.DataSource = selectedRows
    theLabel.ExportOptions.FileName = fileName
    theLabel.ExportOptions.Path = Application.StartupPath
    theLabel.ExportOptions.Quantity = QuantityOptions.AllRecords
    theLabel.ExportOptions.Format = ImageFormats.Png
    theLabel.ExportOptions.Resolution = 300
    theLabel.ExportImage()
    RenameFiles(fileNameMapper, theLabel.ExportOptions.Path)
End Sub

Метод RenameFiles прост и требует небольшой помощи LINQ:

Private Sub RenameFiles(fileNameMapper As Dictionary(Of String,String), path As String)
    Dim dir As New DirectoryInfo(path)
    Dim files = dir.EnumerateFiles(path).
        Where(Function(fi) fileNameMapper.ContainsKey(fi.Name))
    For Each file In files
        Dim destination = IO.Path.Combine(file.Directory.FullName, fileNameMapper(file.Name))
        file.MoveTo(destination, true)
    Next
End Sub

@TimSchmelter, спасибо за ответ и извините, что опоздал с ответом. для этого кода строки file.MoveTo(destination, True) у меня ошибка Error BC30057 Too many arguments to 'Public Overloads Sub MoveTo(destFileName As String)', поэтому я меняю на file.MoveTo(destination) и для этого кода строки fileNameMapper.Add(originalName, newRow.Field(Of String)("Filename")) у меня ошибка Additional information: An item with the same key has already been added. . Пожалуйста, направь меня

dlaksmi 13.08.2024 04:13

Я использовал эту перегрузку MoveTo, возможно, вы используете более старую платформу.Net.

Tim Schmelter 13.08.2024 08:44

Вам придется использовать отладчик, чтобы увидеть, что происходит не так. Вы не можете добавить в словарь несколько повторяющихся ключей. Похоже, что в вашем коде вы повторно используете словарь вместо того, чтобы создавать его в методе, или вы не увеличиваете счетчик, как я.

Tim Schmelter 13.08.2024 08:47

@dlaksmi Вам нужно заменить строку Dim originalName = $"{fileName}{++fileCounter}.png" на две строки fileCounter +=1Dim originalName = $"{fileName}{fileCounter}.png", потому что в VB.NET нет оператора приращения ++.

Andrew Morton 13.08.2024 09:52

@AndrewMorton: интересно, а что тогда делает ++fileCounter? Он не изменяет переменную fileCounter, как в C#, а просто возвращает значение результата?

Tim Schmelter 13.08.2024 10:21

@TimSchmelter, I used this overload of MoveTo, maybe you use an older.Net framework. ты прав, я использую фреймворк 4.8

dlaksmi 13.08.2024 10:41

@TimSchmelter, You have to use the debugger to see what's going wrong. You cant add multiple duplicate keys to a dictionary. So it seems in your code you reuse the dictiionary instead of creating it in the method or you dont incrememt the counter as i did. Я делаю так, как вы, и возможно ли это после того, как я экспортирую файл изображения с помощью экспорта кнопки события и делаю еще одну кнопку события (переименовываю)

dlaksmi 13.08.2024 10:43

@AndrewMorton, You need to change the line Dim originalName = $"{fileName}{++fileCounter}.png" to the two lines fileCounter +=1 Dim originalName = $"{fileName}{fileCounter}.png" because VB.NET doesn't have the ++ increment operator. Спасибо за ваш ответ, но у меня та же ошибка Additional information: An item with the same key has already been added.

dlaksmi 13.08.2024 10:44

@dlaksmi: изменил мой код, чтобы исправить проблему, как предложил Эндрю.

Tim Schmelter 13.08.2024 11:11

@TimSchmelter, спасибо за обновление ответа, но у меня ошибка. Эта строка Dim files = dir.EnumerateFiles(path).Where(Function(fi) fileNameMapper.ContainsKey(fi.Name)) ошибка Additional information: Second path fragment must not be a drive or UNC name. Пожалуйста, помогите мне

dlaksmi 13.08.2024 11:20

@dlaksmi Вам нужно проверить значение path, когда что-то идет не так. Можете ли вы увидеть в нем что-то не так, например, недопустимые символы или что-то вроде двух букв диска?

Andrew Morton 13.08.2024 16:24

@TimSchmelter Можно было бы использовать Interlocked.Increment() для замены оператора пост-инкремента ++ в C#. Возможно, но не обязательно разумно.

Andrew Morton 13.08.2024 18:22

@AndrewMorton, я меняю код с Dim files = dir.EnumerateFiles(path) на Dim files = dir.EnumerateFiles(). Проблема решена Спасибо за помощь. А еще ваша поддержка идеальна

dlaksmi 14.08.2024 11:46

@TimSchmelter, я меняю код с Dim files = dir.EnumerateFiles(path) на Dim files = dir.EnumerateFiles(). Проблема решена Спасибо за помощь. Ваш ответ идеален

dlaksmi 14.08.2024 11:46

Другие вопросы по теме