Справочная информация для ответа
Цель этого вопроса состояла в том, чтобы иметь возможность получить таблицу Excel, отправленную в электронном письме, которое можно было прочитать на Blackberry.Перед тем, как причина проблемы была определена как PublishObjects в Excel, было несколько красных сельдей.Возможно, проблема заключалась в большом количестве ненужных форматов CSS или в размерах ячеек и шрифтов в точках, но, независимо от проблемы, HTML-код не мог правильно отображаться механизмом отображения Blackberry.
Я создал довольнопростой кусок кода VBA для создания таблицы HTML из диапазона.Он скопировал значения, полужирный, курсив, цвет шрифта, цвет фона и ширину столбцов из Excel в таблицу HTML.Хотя первая версия не отвечала всем требованиям Macutan, она показала, что этот подход был жизнеспособным: таблица HTML / CSS с минимальным форматированием отображалась правильно и привлекательно на Blackberry.
Поскольку я внес дополнительные улучшения вВ соответствии с требованиями Macutan, я обнаружил, что та же проблема существует с другими смартфонами, и была общая потребность в такой рутине.Я продолжаю разрабатывать подпрограмму с намерением, чтобы в окончательной версии все форматирование Excel скопировалось в таблицу HTML.
Код и инструкции вскоре превысили ограничение переполнения стека в 30 000 символов.Я передал новые версии Macutan по электронной почте.Документация по модулю кода приведена ниже.Если вы посмотрите на мой профиль, есть адрес электронной почты.Я отправлю копии моего кода по запросу.
' Converts a rectangular range within an Excel worksheet to an Html document.
' RangeToHtml is the only routine in this module designed to be called from
' outside the module. A typical call might be:
' Call RangeToHtml(Worksheets("Data"), 1, 1, RowBottom, ColRight, _
' BorderStyle=Separate, CellPadding=.25)
' The parameters of RangeToHtml are:
' * Wsht A worksheet within an open workbook
' * RowTop \
' * ColumnLeft | Together these specify a rectangular range within
' * RowBottom | Wsht. This is the range to be converted to Html.
' * ColumnRight /
' * Options Zero or more strings of the form OptionName=OptionValue
' specifying which, if any, of the available high-level,
' formatting options are required.
' Individual options are checked. "OptionName" must be the name of a documented
' option and "OptionValue" must be a permitted value for that option. No space is
' permitted before or after the equals sign. OptionNames and OptionValues are
' case insensitive; that is "BorderStyle=Collapse" and "borderstyle=collapse" are
' both acceptable and have the same meaning. However, options are not tested for
' duplicates. You can, for example, specify:
' "BorderStyle=Separate", "BorderStyle=Collapse".
' In this example, "BorderStyle=Separate" will overwrite the default collapse style
' and then "BorderStyle=Collapse" will overwrite "BorderStyle=Separate"
' The available options are:
' * BorderStyle=Collapse
' * BorderStyle=Separate
' With Html/Css, the cells of a table can touch so there appears to be a single
' border between adjacent cells or they can be separated by a small gap so it is
' obvious that each cell has its own border. If no BorderStyle is specified,
' "BorderStyle=Collapse" is the default which means cell borders touch.
' * CellPad=.nn
' If this option is omitted or if "CellPad=0" is specified, there is a minimal gap
' between the cell border and its contents. If the option is, for example,
' "CellPad=.25" then will be a gap of .25 ems around the cell contents. An "em" is
' a measure of length equal to the height of the cell's font.
' * TableWidth=nnn
' If this option is omitted or if "TableWidth=100" is specified, the table occupies
' the entire available display width. If the option is, for example, "TableWidth=50",
' the table will occupy 50% of the available display width. "nnn" can be greater than
' 100 if you wish the user to scroll to see the entire table.
' The table below lists the formats handled at cell and or in-cell level. The default value
' column is explained below.
' CELL-LEVEL IN-CELL DEFAULT VALUE
' bold bold false
' italic italic false
' strikethrough strikethrough false
' underline single underline single no underline
' underline double underline double no underline
' underline accounting no underline
' font colour font colour black
' background colour white
' horizontal alignment left for string; right for numbers and dates
' font size font size 11 or as set as the Excel application level
' font name font name Calibri or as set as the Excel application level
' vertical alignment bottom
' There is no Html/Css equivalent to double or accouting underlining so both are
' converted to single underline.
' Each format is checked for every cell within the range. Formatting information is only
' output to the Html/Css if a format has a non-default value so the output is as clean and
' crisp as possible. You need to be careful about font name and size. Many change the name
' and size for a worksheet but the routine has no access to the worksheet's standard name
' and size; it is the Excel standard that determines the default.
' Html/Css does not handle wrap text at the cell level. If no Excel cell has wrap text set
' then the routine does not output any column size information and columns widths are
' entirely determined by the receiver's browser. If any cell has wrap text set then column
' widths are set by percentage so their relationship depends on the Excel column widths.
' Excel borders are not checked so any borders within the worksheet will not be converted.
' Instead every cell is given a thin, grey border so ther Html looks like a default
' Excel worksheet.
' If the cell value is numeric, the number format is checked for colour names. If
' appropriate, the colour specified in the number format will overwrite the cell's font
' colour. See UpdateHtmlFontColourForNumericFormat for more information.
' Excel's default vertical alignment is "bottom" but Html/Css's is "center". If a cell
' is a single line, the difference will not be apparent but the Html/Css will be bigger
' than necessary because of "vertical-align:bottom" for every cell. It may be worth
' setting every cell's vertical alignment to "center".
' Merged cells are converted to the Html equivalent.
' Most of the work is performed by the macro HtmlStyleTable. This routine returns two
' strings, Style and Table, which RangeToHtml wraps in an Html envelope to create the
' document returned as a string to the caller. Style and Table will look like:
' Style:
' table {border-collapse:collapse;}
' td {border-style:solid; border-width:1px; border-color:#BFBFBF;}
' td.backclr-0000FF {background-color:#0000FF;}
' td.backclr-D7EAF4 {background-color:#D7EAF4;}
' : : :
' span.bold {font-weight:bold;}
' span.fontclr-0070C0 {color:#0070C0;}
' The first two entries in Style are fixed . All other entries depend on
' the formats that appear in the worksheets. The td.xxx entries are used for
' cell-level formats. The span.xxx entries are used for in-cell formats.
' "In-cell formats" refers to part of a cell value being, for example, bold
' and part being non-bold.
' Table:
' <table class="bord-collapse">
' <tr>
' <td rowspan=2 style="width:29.41%" class="back-D7F4EA bold hAlign-center fontsize-095 fontname-Arial">Product</td>
' <td rowspan=2 style="width:11.76%" class="back-D7F4EA bold hAlign-center fontsize-095 fontname-Arial">Position</td>
' Mar12 I coded something similar in response to a Stack Overflow question. The main
' difference is that with the earlier version the formatting styles (for example:
' "background-color:#D7EAF4;") were all within the individual TD elements' STYLE
' attribute. I believe having all the styles in a STYLE element and references
' them by name in the TD elements gives a cleaner document.
' ????? Having answered the Stack Overflow question to the satisfaction of the OP, I
' continued developing the routine. It quickly became clear that a full
' conversion was not practical in VBA so I converted my code to VB before
' continuing. I have quite an attractive VB version but it is slower than I would
' like. There are many complaints on the internet about the speed of access to
' Excel from VB and some bizarre solutions. I discovered a different approach
' which meant a program could obtain a lot of information about a worksheet in a
' single call to the InterOp. That information was provided as a string for which
' the documentation was poor and often wrong. However, I did manage to decode the
' string. Sometime, I must bring all my separate routines together in a single
' program to give a fast, complete conversion.
' Jun16 A request for a copy of my original code meant I searched my archives for that
' code. I did not find that code but I realised I could write a better routine.
' All routines in this module were coded and debugged in stages. The first
' version handled three cell-level formats. The final version handled more
' formats at both cell and in-cell level.
' Aug16 Added HtmlStyleTable options.