вторник, 13 мая 2008 г.

Обновление - Software development classic mistakes

Макконнелл и его компания, Construx Software Builders, выпустили результаты опроса "Classic mistakes".

За год в нем приняли участие 500 добровольцев, которым предлагалось оценить частоту появления и опасность ошибок из списка "классических" ошибок в проектах с их участием.

Результаты оформлены в 40-страничный whitepaper, доступный на сайте construx (для скачивания потребуется регистрация).

Анонс этой статьи в блоге Contrux содержит очень интересные выдержки - самые часто встречающиеся ошибки, самые опасные ошибки, и т.п. Лидируют в списках чрезмерно оптимистичные сроки, нереальные ожидания/планы, и недостаточный Quality Assurance.

Ещё анонс кишит копирайтами, поэтому цитировать что-либо ещё из него мне не хочется. Почитайте статью, данные о самых частых и самых редких ошибках очевидно-невероятны :)

суббота, 3 мая 2008 г.

Xlsx to html

Михаил Дроздов, мой коллега из ИВС, написал статью на любимую им тему - "Как получить таблицу данных из xlsx-файла у приложения Excel из MS Office 2007 используя структуру данных формата Open XML?". В ней описано, как без использования библиотек MS Office, одним xslt-преобразованием, получить html-представление Excel-листа. Такими вот фокусами с OpenXml-форматами он у нас занимается постоянно :)

От себя могу добавить, что содержимое xslx-файла, над которым делаются преобразования, можно получить с помощью утилит командной строки 7-zip, или следующим кодом:

System.IO.Packaging.Package p = System.IO.Packaging.Package.Open(@"book1.xlsx");

System.IO.Packaging.PackagePartCollection parts= p.GetParts();

foreach(System.IO.Packaging.PackagePart part in parts)

{

    using (BinaryReader rdr = new BinaryReader(part.GetStream()))

    {

        string filename = part.Uri.OriginalString;

        filename = filename.Substring(filename.LastIndexOf(@"/") + 1);

        using (BinaryWriter wr = new BinaryWriter(File.Create(filename)))

        {

            int bytesRead = 0;

            do

            {

                byte[] buffer = new byte[0xFFFF];

                bytesRead = rdr.Read(buffer, 0, buffer.Length);

                wr.Write(buffer, 0, bytesRead);

            } while (bytesRead > 0);

        }

    }

}


Для System.IO.Packaging понадобится WindowsBase.dll, входящая в состав .Net Framework 3.0