Archive for the 'Programming' Category

Файлы Excel с диаграммами и без.

Sunday, April 8th, 2007

Excel таблицы создавать проще чем казалось бы. Нынешние MS Office средства позволяют создавать подобные таблицы с диаграммами используя симбиоз технологий HTML + XML+ VML

Итак. Для создания простой таблицы с данными создаём файл, который содержит:

<html>
  <body>
    <table>
      <tr>
        <td>1</td>
      </tr>
      <tr>
        <td>2</td>
      </tr>
      <tr>
        <td>3</td>
      </tr>
      <tr>
        <td>4</td>
      </tr>
    </table>
  </body>
</html>

Сохраним файл под именем excelfile.xls, откроем его с помощью MS Excel и получим результат:

Excel file

Как видно - результат ничем не отличается от варианта создания файла в самом MS Excel за исключением разграничения ячеек сероватым стандартным цветом. Для того, чтобы исправить этот “баг” (или фичу) вносим следующие правки:

<body style="border:.5pt solid silver;">

excel file with borders

Для того, чтобы использовать формулы в таблицах - определяем xml namespace urn:schemas-microsoft-com:office:excel:

<html
    xmlns:x="urn:schemas-microsoft-com:office:excel">

Далее пример использования функции SUM (сумма) и простого сложения значений ячеек с использованием нового аттрибута x:fmla:

<html
     xmlns:x="urn:schemas-microsoft-com:office:excel">
  <body style="border:.5pt solid silver;">
    <table>
      <tr>
        <td>1</td>
      </tr>
      <tr>
        <td>2</td>
      </tr>
      <tr>
        <td>3</td>
      </tr>
      <tr>
        <td>4</td>
      </tr>
      <tr>
      	<td style="width: 48pt"
             x:fmla="=SUM(A1:A4)"></td>
      </tr>
      <tr>
        <td x:fmla="=A1+A2"></td>
      </tr>
    </table>
  </body>
</html>

Я добавил ещё определение ширины для ячейки, где выводится сумма style=”width: 48pt” (48pt - это стандартная ширина ячейки в excel):

Excel file with formula

Добавляем диаграмму:
Дописываем ещё один namespace:

<html xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns:v="urn:schemas-microsoft-com:vml">

И после определения таблицы дописываем кусок xml кода

<!--[if gte vml 1]>
<v:shape style='position:absolute; width: 600px;
height: 400px'>
   <x:ClientData ObjectType="Chart">
    <x:WebChart>
     <x:Scaling>
      <x:ScaleID>0</x:ScaleID>
      <x:Orientation>MinMax</x:Orientation>
     </x:Scaling>
     <x:Scaling>
      <x:ScaleID>1</x:ScaleID>
      <x:Orientation>MinMax</x:Orientation>
     </x:Scaling>
     <x:Chart>
      <x:Title>
       <x:Caption>
        <x:DataSource>-1</x:DataSource>
        <x:Data>&quot;<x:B>Name of diagram</x:B>&quot;
        </x:Data>
       </x:Caption>
       <x:Border>
        <x:ColorIndex>None</x:ColorIndex>
       </x:Border>
      </x:Title>
      <x:PlotArea>
       <x:Interior>
        <x:ColorIndex>14</x:ColorIndex>
       </x:Interior>
       <x:Graph>
        <x:Type>Line</x:Type>
        <x:SubType>Standard</x:SubType>
        <x:ScaleID>0</x:ScaleID>
        <x:ScaleID>1</x:ScaleID>
        <x:Series>
         <x:Index>0</x:Index>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;Line 1&quot;</x:Data>
         </x:Caption>
         <x:Category>
          <x:DataSource>0</x:DataSource>
          <x:Data>excelfile!$B$1:$B$6</x:Data>
         </x:Category>
         <x:Value>
          <x:DataSource>0</x:DataSource>
          <x:Data>excelfile!$A$1:$A$6</x:Data>
         </x:Value>
        </x:Series>
       </x:Graph>
       <x:Axis>
        <x:Placement>Bottom</x:Placement>
        <x:AxisID>0</x:AxisID>
        <x:ScaleID>0</x:ScaleID>
        <x:Title>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;<x:B>Axis X</x:B>&quot;
          </x:Data>
         </x:Caption>
         <x:Border>
          <x:ColorIndex>None</x:ColorIndex>
         </x:Border>
        </x:Title>
        <x:Type>Category</x:Type>
       </x:Axis>
       <x:Axis>
        <x:Placement>Left</x:Placement>
        <x:AxisID>1</x:AxisID>
        <x:ScaleID>1</x:ScaleID>
        <x:MajorGridlines/>
        <x:Title>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;<x:B>Axis Y</x:B>&quot;
          </x:Data>
         </x:Caption>
         <x:Border>
          <x:ColorIndex>None</x:ColorIndex>
         </x:Border>
        </x:Title>
        <x:Type>Value</x:Type>
       </x:Axis>
      </x:PlotArea>
      <x:Legend>
       <x:Placement>Right</x:Placement>
      </x:Legend>
     </x:Chart>
    </x:WebChart>
   </x:ClientData>
  </v:shape>
<![endif]-->

Это минимальный набор инструкций, которых необходимо для корректного отображения диаграммы. При просмотре XML всё становится понятным из названий тегов. Что на мой взгляд может показаться непонятным:

  • x:ClientData ObjectType=”Chart” - эта инструкция говорит о том, что это и есть именно диаграмма, а не другой какой-нибудь объект
  • Scaling - тут указываются два блока определений Scaling, для горизонтальной и вертикальной оси, MaxMin можно заменить на MinMax, тогда данные будут “отсортированы” от минимального к максимальному
  • x:DataSource - если DataSource равен 0, значит данные будут браться по указанной в x:Data ссылке из листа данных, если же равен -1, но данные записываются прямо в x:Data
  • x:Type - тут указывается тип диаграммы. В нашем случае это Line. Может быть например Bar, Pie и др.
  • Для добавления ещё одной линии данных нужно продублировать блок x:Series соответственно изменив блок с данными

Excel file with diagram

Пример созданного файла: excelfile.zip

Українська локалізація JSCalendar v1.0

Saturday, December 23rd, 2006

ukranian localization jscalendarПредставляю українську локалізацію відомого JavaScript’ового календаря JSCalendar v1.0. Шукав в Інтернеті - не знайшов. Взагалі то там і перекладати майже нічого. Але нехай валяється.

Файл локалізації

Спасаем ввод пользователя

Saturday, December 16th, 2006

Очень часто приходится редактировать свои данные с помощью больших форм. Иногда формы бывают ну просто неоправданно большие. Либо же само заполнение по-разным причинам занимает много времени (письмо, отчёт). Заполнив форму наполовину случайно не туда ткнуть пальцем - и страница или обновляется или делает back. А бывают ещё те мышки, у которых по бокам две жирные кнопяры. Эти кнопки в броузере играют роль ВПЕРЁД и НАЗАД. В общем данные теряются.

туда-сюда
(кстати, только сейчас заметил, что у меня в ИЕ надпись back есть, а forward нет)

Дабы избавить пользователя своего сервиса от таких вот глупых неприятностей, можно ввести javascriptовую проверку, были ли изменены данные формы. Если изменения произошли - то запрашивать подтверждение типа “Осторожно, вы не сохранили ваши данные. Продолжить?”, если нет, то отпускать без лишних вопросов.

вопрошание

В двух словах:
нужно задать событие window.onbeforeunload. В нём делать проверку были ли произведены изменения в этом сеансе работы. если не было изменений возвращать window.undefined, в противном случае возвращать строку предупреждения. Самое интересное, что это делается средствами броузера. Он сам спрашивает “Are you sure you want to navigate away from this page?” (firefox), а Вам нужно указать только лишь возможные последствия того, что может случиться в случае незасабмичивания формы.

пример кода: onunload.zip (630 Байт)

Проверка существования домена.

Wednesday, November 15th, 2006

Как проверить занят домен в определённой зоне или не занят? Как это делают провайдеры и регистраторы доменов?

checkdomain.png

Ничего на самом деле сложного в этом нет. Для этого не нужно абсолютно никаких платных сервисов.
Любой зоне соответствует свой WHOIS сервер. Через который можно узнать подробную информацию о человеке/организации, на которую зарегистрирован тот или иной домен. Нопример зоне ua соответствует сервер whois.com.ua. Он также отвечает за домены второго уровня таких как net.ua, com.ua и т.д. Также получить данные по украинским доменам можно через глобальный сервер whois.ripe.net.

Пример реализации на PHP с использованием сокетов:

$connection = @fsockopen("whois.com.ua", 43);
fputs($connection, "chizar.org.ua");
$buffer = "";
while (!feof($connection)) {
$buffer. = fgets($connection, 4096);
}
fclose($connection);
if (strpos($buffer, "No entries found for domain")){
// домен свободен
} else {
// домен занят
}

Хочу заметить, что все сервера выдают разные сообщения об ошибке, по которым делается вывод о том, что домен не зарегистрирован. На whois.com.ua он такой, как в примере (No entries found for domain), но на других серверах он может быть совсем другим. Например:

  • на сервере whois.ripn.net, который отвечает за зону RU - отрицательный ответ выглядит “No entries found for the selected source(s).”
  • сервер whois.afilias.info, отвечающий за зону INFO, выдаёт просто “NOT FOUND”
  • и т.д

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

Yandex.XML + Java. Пример использования.

Sunday, September 24th, 2006

Вот набросал классик, который можно использовать как площадку для старта в использовании Яндексового сервиса XML.

Принцип работы: отсылаем самый простой запрос (в данном примере самый простой) POST методом. И тут же получаем в ответ результат поиска. Данные приходят в UTF-8. Класс автономный, за исключением использования JDOM для парсинга XML. Так что не забудте в CLASSPATH включить ждарку jdom.

Исходник: XmlYandex.zip (1.390 Б) - без JDOM.