Сохранение графа из excel в виде отдельного файла изображения с использованием VBA [duplicate]

Вот решение:

<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

Чтобы проверить его глубоко, я ввел в теги автоматического закрытия строки, например:

  1. & lt; hr / & gt;
  2. & lt; br / & gt;
  3. & lt; br & gt;

Я также вводил теги с:

  1. один атрибут
  2. содержит более одного атрибута
  3. , значение которого привязано либо в одинарные кавычки, либо в двойные кавычки
  4. атрибуты, содержащие одинарные кавычки, когда разделитель является двойным цитата и наоборот
  5. «нечеткие» атрибуты с пробелом перед символом «=» после него и до и после него.

Если вы найдете что-то, что не работает в доказательстве концепции выше, я доступен для анализа кода, чтобы улучшить свои навыки.

& lt; EDIT & gt; Я забыл, что вопрос от пользователя заключался в том, чтобы избежать разбора самозакрывающихся тегов. В этом случае шаблон проще, превратившись в это:

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

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

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

& lt; / EDIT & gt;

Понимание шаблона

Если кто-то заинтересован в обучении подробнее о шаблоне, я предоставляю некоторую строку:

  1. первое подвыражение (\ w +) соответствует имени тега
  2. , второе подвыражение содержит шаблон атрибут. Он состоит из: одного или нескольких пробелов \ s + имя атрибута (\ w +) ноль или более пробелов \ s * (возможно или нет, оставляя здесь пробелы) символ "=" снова, ноль или более пробелов разделитель значения атрибута, одинарная или двойная кавычка («|»). В шаблоне одиночная кавычка экранируется, потому что она совпадает с разделителем строки PHP. Это подвыражение захватывается скобками, поэтому на него можно ссылаться снова для синтаксического анализа закрытия атрибута, поэтому очень важно значение атрибута, сопоставляемое почти : (. *?); в этом конкретном синтаксисе, используя жадное соответствие ( вопросительный знак после звездочки), механизм RegExp позволяет использовать оператор «look-ahead», который соответствует чему-либо, но что следует за этим подвыражением, здесь весело: элемент \ 4 является оператором обратной ссылки, который ссылается на подзадачу, выражение, определенное ранее в шаблоне, в данном случае я имею в виду четвертое подвыражение, которое является первым a ttribute delimiter обнаружен ноль или более пробелов \ s * конец суб-выражения атрибута заканчивается здесь, с указанием нуля или более возможных вхождений, заданных звездочкой.
  3. Затем, поскольку тег может заканчиваться пробелом перед «& gt;», символ, ноль или более пробелов сопоставляются с подшаблоном \ s *.
  4. Тег, который должен соответствовать, может заканчиваться простым «& gt;» символ или возможное закрытие XHTML, которое использует перед ним косую черту: (/> |>). Слэш, конечно, сбежал, поскольку он совпадает с разделителем регулярных выражений.

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

1
задан R3uK 7 February 2017 в 14:45
поделиться

2 ответа

Основная ошибка указала @J_Lard уже в его комментарии.

Но я бы использовал ChartObject, а не лист Chart. С этим вы можете определить размер вывода вместо того, чтобы получить всю область диаграммы на картинке.

И, используя шаг F8, паста и экспорт будут работать, а в режиме реального времени ChartObject должен быть активирован.

Sub Export()

 Dim oWs As Worksheet
 Dim oRng As Range
 Dim oChrtO As ChartObject
 Dim lWidth As Long, lHeight As Long

 Set oWs = ActiveSheet
 Set oRng = oWs.Range("B2:H11")

 oRng.CopyPicture xlScreen, xlPicture
 lWidth = oRng.Width
 lHeight = oRng.Height

 Set oChrtO = oWs.ChartObjects.Add(Left:=0, Top:=0, Width:=lWidth, Height:=lHeight)

 oChrtO.Activate
 With oChrtO.Chart
  .Paste
  .Export Filename:="Case.jpg", Filtername:="JPG"
 End With

 oChrtO.Delete

End Sub

Если путь не указан, Case.jpg будет сохранен в местоположении сохранения по умолчанию. Вероятно, это ваш каталог документов пользователя C:\Users\YourName\Documents\

4
ответ дан Axel Richter 16 August 2018 в 05:12
поделиться
  • 1
    Спасибо, это заставило его работать. В каком формате вы порекомендовали бы мне экспортировать его, чтобы я мог получить наилучшее качество изображения, так как оно предназначено для отчета? – IAIAIA 7 February 2017 в 15:35
  • 2
    Хм, это зависит ;-). Мой любимый - это, безусловно, PNG. Используя xlPicture вместо xlBitmap, я уже предоставил. Но это также зависит. Попробуйте разные форматы, сравните результаты и выберите лучшее, на ваш взгляд. – Axel Richter 7 February 2017 в 15:52
  • 3
    Отлично, спасибо за вашу помощь. – IAIAIA 7 February 2017 в 15:54

Вот как экспортировать тот же путь, что и книга:

Sub Export()
Dim ws As Worksheet
Dim Rng As Range
Dim Chrt As Chart
Dim ExportPath As String

Set ws = ActiveSheet
Set Rng = ws.Range("B2:H11")
ExportPath = ThisWorkbook.Path & "\Case.jpg"

Set Chrt = ThisWorkbook.Charts.Add
Rng.CopyPicture xlScreen, xlBitmap   

With Chrt
    .Paste
    .Export FileName:=ExportPath, Filtername:="JPG"
End With
End Sub
0
ответ дан R3uK 16 August 2018 в 05:12
поделиться
  • 1
    Теперь он генерирует пустой лист в excel (где я предполагаю, что диаграмма должна отображаться) и файл с именем «False». в каталоге. Это то, что выглядит лист excel: i.imgur.com/NsqNrdN.jpg Возможно ли это из-за комбинированных ячеек? – IAIAIA 7 February 2017 в 15:13
  • 2
    @IAIAIA: Я редактировал код, дайте ему попробовать! ;) – R3uK 7 February 2017 в 15:16
  • 3
    Отлично, теперь мы получаем изображение с ожидаемым именем и расширением, но оно по-прежнему отображается как в excel, так и в формате .jpg: / – IAIAIA 7 February 2017 в 15:19
Другие вопросы по тегам:

Похожие вопросы: