Находите только суб-и супер-скрипт в файлах Excel и заменяйте их одинаковыми Unicode или символами - PullRequest
0 голосов
/ 15 апреля 2019

Мы преподаватели, и у нас много MCQ по химии, физике и математике в файлах Excel с множеством формул и уравнений. Когда мы пытались импортировать эти MCQ в базу данных на основе MySQL, все индексы и надстрочные индексы, использованные в формулах, терялись и воспринимались как нормальные символы, например H2SO4, CO2, CH3 и т. Д., И заставляли наши формулы и элементы называть бессмысленными. Есть ли какое-нибудь решение, с помощью которого mySQL может импортировать индексы и надстрочные индексы как в Excel? Или есть какое-то решение, с помощью которого мы можем заменить только индекс Excel и индекс верхнего уровня на символы или Unicode, потому что MySQL может выбрать символы и Unicode как есть? В данный момент мы заменяем вспомогательные и суперскрипты символами / юникодом одного и того же типа вручную, чтобы они оставались неизменными после импорта в mysql для нашего веб-приложения. Но на выполнение этой сложной задачи уйдет почти два месяца. Мы получаем помощь с этого сайта https://unicode -table.com / ru / # superscripts-and-subscripts Поэтому, пожалуйста, помогите нам в этом.

Сначала я попытался задать вопрос: как я могу импортировать Excel с суб-и супер-скриптами в mysql, мой самый первый вопрос в сообществе, но не получил ответа

при использовании предоставленного вами кода / метода / решения только вспомогательные и суперскрипты, найденные во всех файлах Excel, будут заменены одинаковыми символами юникода / символа, а затем могут быть импортированы в MySQL как есть и будут отображаться в Интернете так же, как например, H₂O в Excel -> H₂O в сети (2 - символ Юникода)

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Хотя @Ambie уже представила хорошо продуманное решение и также хорошо объяснила темы, но даже тогда я просто хочу поделиться своими подробностями следа и кода на этот счет. Здесь любые символы Super & Subscript Unicode должны быть представлены на чистом листе с именем «ScriptMap» в пустом файле Excel. Я использовал десятичное значение столбцов 4,5, полученных с Hex2DEC из значения Hex Unicode. Таблица скопирована с какого-либо веб-сайта (не может подтвердить подлинность), может быть изменена и / или добавлена ​​к найденному.

Chars   Uni Sup Uni Sub Dec Sup Dec Sub
0   2070    2080    8304    8320
1   00B9    2081    185 8321
2   00B2    2082    178 8322
3   00B3    2083    179 8323
4   2074    2084    8308    8324
5   2075    2085    8309    8325
6   2076    2086    8310    8326
7   2077    2087    8311    8327
8   2078    2088    8312    8328
9   2079    2089    8313    8329
a   1d43    2090    7491    8336
b   1d47        7495    0
c   1d9c        7580    0
d   1d48        7496    0
e   1d49    2091    7497    8337
f   1da0        7584    0
g   1d4d        7501    0
h   02b0    2095    688 8341
i   2071    1d62    8305    7522
j   02b2    2c7c    690 11388
k   1d4f    2096    7503    8342
l   02e1    2097    737 8343
m   1d50    2098    7504    8344
n   207f    2099    8319    8345
o   1d52    2092    7506    8338
p   1d56    209a    7510    8346
q           0   0
r   02b3    1d63    691 7523
s   02e2    209b    738 8347
t   1d57    209c    7511    8348
u   1d58    1d64    7512    7524
v   1d5b    1d65    7515    7525
w   02b7        695 0
x   02e3    2093    739 8339
y   02b8        696 0
z           0   0
A   1d2c        7468    0
B   1d2e        7470    0
C           0   0
D   1d30        7472    0
E   1d31        7473    0
F           0   0
G   1d33        7475    0
H   1d34        7476    0
I   1d35        7477    0
J   1d36        7478    0
K   1d37        7479    0
L   1d38        7480    0
M   1d39        7481    0
N   1d3a        7482    0
O   1d3c        7484    0
P   1d3e        7486    0
Q           0   0
R   1d3f        7487    0
S           0   0
T   1d40        7488    0
U   1d41        7489    0
V   2c7d        11389   0
W   1d42        7490    0
+   207A    208A    8314    8330
-   207B    208B    8315    8331
=   207C    208C    8316    8332
(   207D    208D    8317    8333
)   207E    208E    8318    8334

Поскольку в проекте используется несколько файлов Excel, в начале выполнения кода можно выбрать несколько файлов. Это будет цикл через все выбранные файлы, все листы и ячейки. Однако я задерживаюсь, так как меня не устраивает скорость / эффективность кода. Я обнаружил, что на замену примерно 100 ячеек (в моем старом ноутбуке) уходит около 15 минут, каждая из которых содержит около 50 подстрочных индексов в используемом диапазоне около 100 X 26 ячеек, содержащих текст. При запуске я начал с файлов размером 100 × 26, каждый из которых содержал около 50 подстрочных индексов, и мне пришлось прервать след в середине выполнения. Таким образом, код может быть непригодным для использования, если количество файлов и число подстрочных индексов (и используемых диапазонов) очень велики. Хотя мне лично не нравится отключать «Вычисление», «Обновление экрана» и «Включить события», это также не может значительно ускорить его. Поэтому Я приглашаю дальнейшие ответы с повышенной скоростью / эффективностью подобной операции.

Код (добавляется и исполняется из пустого файла, содержащего лист "ScriptMap"):

Option Explicit
Sub ToUni()
Dim tm As Long
Dim Wb As Workbook, Ws As Worksheet, Rng As Range, Cel As Range
Dim Fname As Variant, Cha As Characters
Dim fl As FileDialog, ScrMap As Variant
Dim SupTxt As String
Dim i As Long, n As Long, UniNo As Long
tm = Timer
ScrMap = ThisWorkbook.Worksheets("ScriptMap").Range("A2:E65").Value 'modify to your requirement

'select files for conversion
Set fl = Application.FileDialog(msoFileDialogFilePicker)
With fl
  .AllowMultiSelect = True
  .InitialFileName = "C:\Temp\"
  .Filters.Clear
  .Filters.Add "All Excel Files", "*.xls*"
  .Show
End With

If fl.SelectedItems.Count <= 0 Then Exit Sub

   For Each Fname In fl.SelectedItems
   Set Wb = Workbooks.Open(Fname)
      For Each Ws In Wb.Worksheets
      Debug.Print Ws.Name
      Set Rng = Ws.UsedRange
        For Each Cel In Rng.Cells
        Debug.Print Cel.Address(False, False)
        If VarType(Cel.Value) = vbString Then
                For i = 1 To Cel.Characters.Count
                If Cel.Characters(i, 1).Font.Superscript Or Cel.Characters(i).Font.Subscript Then
                SupTxt = Cel.Characters(i, 1).Text

                    'Find unicode value of the char from ScrMap if avialable
                    For n = LBound(ScrMap, 1) To UBound(ScrMap, 1)
                    UniNo = 0

                        If SupTxt = ScrMap(n, 1) Then
                        If Cel.Characters(i, 1).Font.Superscript Then UniNo = ScrMap(n, 4)
                        If Cel.Characters(i, 1).Font.Subscript Then UniNo = ScrMap(n, 5)
                        End If
                    If UniNo > 0 Then Exit For
                    Next n

                    If UniNo > 0 Then
                    Cel.Characters(i, 1).Text = ChrW(UniNo)
                    'Debug.Print i, SupTxt, UniNo
                    End If

                End If
            Next i
        End If

        Next Cel
      Rng.Font.Superscript = False
      Rng.Font.Subscript = False
      Next Ws

   Debug.Print Wb.Path & "\" & Wb.Name
   Application.DisplayAlerts = False
   Wb.SaveAs Wb.Path & "\1converted_" & Wb.Name
   Wb.Close False
   Application.DisplayAlerts = True
   Next Fname
Debug.Print Timer - tm
End Sub

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

0 голосов
/ 16 апреля 2019

Не видя ваших данных и способа передачи данных, очень сложно дать вам ответ.Я подозреваю, что именно поэтому вы не получили ответов на свои посты.

Я предполагаю, что есть неплохой шанс, что ваши уравнения Excel просто отформатируются как символы под- и суперскриптов, так что опция может бытьвыполнить преобразование Unicode в самом Excel.

Приведенный ниже код должен помочь вам начать работу - хотя, я уверен, вы уже читали, что этот сайт не является бесплатной службой написания кода, поэтому вы 'Мне нужно изменить и / или расширить его в соответствии с вашими потребностями.Он в основном создает карту под- и надстрочных символов в их эквиваленты Юникода, а затем преобразует любые символы, которые он может найти на карте.Если нет совпадения, он закрасит символ красным.

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

Удачи.

Option Explicit

Public Sub RunMe()
    Dim ws As Worksheet
    Dim cell As Range
    Dim map As Collection, unresolveds As Collection
    Dim i As Long
    Dim str As String
    Dim v As Variant

    'Create the map of sub- and superscripts.
    Set map = GetScriptsMap

    'Create the output sheet.
    With ThisWorkbook.Worksheets
        Set ws = .Add(After:=.Item(.Count))
    End With

    'Iterate each cell in the range.
    For Each cell In Sheet1.UsedRange.Cells
        If cell.Characters.Count > 0 Then
            'Reset the collection of unresolved characters.
            Set unresolveds = New Collection
            'Iterate the text character by character.
            For i = 1 To cell.Characters.Count
                With cell.Characters(i, 1)
                    str = .Text
                    With .Font
                        'Check for sub- or superscript.
                        If .Subscript Or .Superscript Then
                            'Attempt a lookup of sub- or superscript characters.
                            'If the lookup fails, the str variable will hold its
                            'old .Text value.
                            On Error Resume Next
                            str = ChrW(map(str & IIf(.Subscript, "B", "P")))
                            'A failed lookup will return an error number,
                            'so add it to the collection of unresolved characters.
                            If Err.Number > 0 Then unresolveds.Add i
                            On Error GoTo 0
                        End If
                    End With
                End With
                'Build the output cell.
                With ws.Range(cell.Address)
                    .Value = .Value & str
                End With
            Next
            'Colour the unresolved characters red.
            For Each v In unresolveds
                ws.Range(cell.Address).Characters(v, 1).Font.Color = vbRed
            Next
        End If

    Next
End Sub

Private Function GetScriptsMap() As Collection
    Dim map As Collection

    Set map = New Collection

    'Superscript unicodes - key suffixed with 'P'
    map.Add &H2070, "0P"
    map.Add &H2071, "1P"
    map.Add &HB2, "2P"
    map.Add &HB3, "3P"
    map.Add &H2074, "4P"
    map.Add &H2075, "5P"
    map.Add &H2076, "6P"
    map.Add &H2077, "7P"
    map.Add &H2078, "8P"
    map.Add &H2079, "9P"
    map.Add &H207A, "+P"
    map.Add &H207B, "-P"
    map.Add &H207C, "=P"
    map.Add &H207D, "(P"
    map.Add &H207E, ")P"
    map.Add &H207F, "nP"
    'Subscript unicodes - key suffixed with 'B'
    map.Add &H2080, "0B"
    map.Add &H2081, "1B"
    map.Add &H2082, "2B"
    map.Add &H2083, "3B"
    map.Add &H2084, "4B"
    map.Add &H2085, "5B"
    map.Add &H2086, "6B"
    map.Add &H2087, "7B"
    map.Add &H2088, "8B"
    map.Add &H2089, "9B"
    map.Add &H208A, "+B"
    map.Add &H208B, "-B"
    map.Add &H208C, "=B"
    map.Add &H208D, "(B"
    map.Add &H208E, ")B"
    map.Add &H2090, "aB"
    map.Add &H2091, "eB"
    map.Add &H2092, "oB"
    map.Add &H2093, "xB"
    map.Add &H2094, ChrW(&H18F) & "B"
    map.Add &H2095, "hB"
    map.Add &H2096, "kB"
    map.Add &H2097, "lB"
    map.Add &H2098, "mB"
    map.Add &H2099, "nB"
    map.Add &H209A, "pB"
    map.Add &H209B, "sB"
    map.Add &H209C, "tB"

    Set GetScriptsMap = map
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...