Я пытаюсь переименовать изображение файла после экспорта с таблицей данных в 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
После этого вы сможете переименовать файлы, просто сопоставьте исходное имя с желаемым новым именем, например, в 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
Я использовал эту перегрузку MoveTo, возможно, вы используете более старую платформу.Net.
Вам придется использовать отладчик, чтобы увидеть, что происходит не так. Вы не можете добавить в словарь несколько повторяющихся ключей. Похоже, что в вашем коде вы повторно используете словарь вместо того, чтобы создавать его в методе, или вы не увеличиваете счетчик, как я.
@dlaksmi Вам нужно заменить строку Dim originalName = $"{fileName}{++fileCounter}.png"
на две строки fileCounter +=1
Dim originalName = $"{fileName}{fileCounter}.png"
, потому что в VB.NET нет оператора приращения ++
.
@AndrewMorton: интересно, а что тогда делает ++fileCounter
? Он не изменяет переменную fileCounter
, как в C#, а просто возвращает значение результата?
@TimSchmelter, I used this overload of MoveTo, maybe you use an older.Net framework.
ты прав, я использую фреймворк 4.8
@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.
Я делаю так, как вы, и возможно ли это после того, как я экспортирую файл изображения с помощью экспорта кнопки события и делаю еще одну кнопку события (переименовываю)
@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: изменил мой код, чтобы исправить проблему, как предложил Эндрю.
@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 Вам нужно проверить значение path
, когда что-то идет не так. Можете ли вы увидеть в нем что-то не так, например, недопустимые символы или что-то вроде двух букв диска?
@TimSchmelter Можно было бы использовать Interlocked.Increment() для замены оператора пост-инкремента ++
в C#. Возможно, но не обязательно разумно.
@AndrewMorton, я меняю код с Dim files = dir.EnumerateFiles(path)
на Dim files = dir.EnumerateFiles()
. Проблема решена Спасибо за помощь. А еще ваша поддержка идеальна
@TimSchmelter, я меняю код с Dim files = dir.EnumerateFiles(path)
на Dim files = dir.EnumerateFiles()
. Проблема решена Спасибо за помощь. Ваш ответ идеален
@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.
. Пожалуйста, направь меня