Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2010, 15:56   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию xml to xls, xlsx

есть xml Spreadsheet следующего содержания
Код:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"/>
<Styles>
	<Style ss:ID="s01">
		<Alignment ss:Vertical="Top" ss:Horizontal="Left" ss:WrapText="1"/>
		<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
		<Borders>
			<Border ss:Position="Bottom" ss:Color="#000000" ss:LineStyle="Continuous" ss:Weight="1"/>
			<Border ss:Position="Right" ss:Color="#000000" ss:LineStyle="Continuous" ss:Weight="1"/>
		</Borders>
	</Style>
</Styles>
<Worksheet ss:Name="Table 1">
<Table>
	<Column ss:Index="1" ss:AutoFitWidth="0" ss:Width="99"/>
	<Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="100"/>
	<Row ss:Index="1" ss:AutoFitHeight="0" ss:Height="13">
		<Cell ss:Index="1" ss:StyleID="s01"/>
		<Cell ss:Index="2" ss:StyleID="s01"/>
	</Row>
	<Row ss:Index="2" ss:AutoFitHeight="0" ss:Height="13">
		<Cell ss:Index="1" ss:StyleID="s01"/>
		<Cell ss:Index="2" ss:StyleID="s01"/>
	</Row>
</Table>
</Worksheet>
</Workbook>
через СОМ модель хочу сохранить его как xls и xlsx. Пишу на С++, но думаю что по методам буде понятно.
Код:
Excel::_WorkbookPtr workBook = app->Workbooks->OpenXML(xmlFile);
_bstr_t bstrFile(L"C:/try.xls");
workBook->_SaveAs(bstrFile, Excel::xlExcel7, &vtMissing, &vtMissing, &vtMissing, &vtMissing, Excel::xlNoChange);
		
app->PutVisible(0, true);
на SaveAs бросает непонятное исключение. Если 2ой параметра заменить на vtMissing, то сохраняет нормально. Но при открытии документа появляется нехороший диалог "The file you are trying to open, 'try.xls', is in a different format than specified by the extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now?"

Как корректно пересохранить xml СОМ моделью в xls, xlsx? Что я делаю не так? Правильно ли я устанавливаю 2ой параметр в Excel::xlExcel7 или нужен другой параметр?
Diego__ вне форума Ответить с цитированием
Старый 03.11.2010, 16:11   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

xlWorkbookNormal = -4143 (формат XLS - Excel2003)
xlOpenXMLWorkbook = 51 (формат XLSX - Excel2007)

Вторым параметром подставьте число 51 или -4143 - и получите нужный результат.
EducatedFool вне форума Ответить с цитированием
Старый 03.11.2010, 16:38   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

спасибо за ответ.
что-то не так...
попробовал каждое из значений - в обоих случаях исключение
message равен "Unknown error 0x800A03EC". Пробовал менять OpenXML(xmlFile); на app->Workbooks->Open(xmlFile); эффект тот же

Код:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
Excel::_ApplicationPtr app;
try
{
	HRESULT result = app.GetActiveObject(L"Excel.Application");
	if (FAILED(result))
	{
		result = app.CreateInstance(L"Excel.Application");
		if (FAILED(result))
			return 0;
		app->PutVisible(0, false);
	}

	_bstr_t bstrFile(L"C:/input.xml");

	Excel::_WorkbookPtr workBook = app->Workbooks->Open/*XML*/(bstrFile);
	if (workBook)
	{
		_bstr_t bstrFile(L"C:/output.xls");

		HRESULT res = workBook->SaveAs(bstrFile, Excel::xlWorkbookNormal, &vtMissing, &vtMissing, &vtMissing, &vtMissing, Excel::xlNoChange);
		app->PutVisible(0, true);
	}
}
catch(const _com_error &exept)
{
	const wchar_t * message = exept.ErrorMessage();
	return 0;
}

CoUninitialize();

return 0;
}

Последний раз редактировалось Diego__; 03.11.2010 в 17:57.
Diego__ вне форума Ответить с цитированием
Старый 03.11.2010, 17:14   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

попробовал на вход подать xls файл, открыл методом Open, и в SaveAs указал L"try.xls" - результат такой же
Diego__ вне форума Ответить с цитированием
Старый 10.12.2010, 10:42   #5
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

думаю что-то здесь не продумано:
пересохранить как html получается нормально, а в excel-евские форматы - fail. Но если поменять направление слешей с "C:/output.xls" на "C:\\output.xls", то сохраняет все нормально.

Т.е. получается, что один и тот же методов для пересохранения в различные форматы принимает различный формат строки . По крайней мере на С++.
Diego__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XLS converter XML edition Microsoft Office Excel 1 22.09.2010 19:32
Сonvert из .XML в .CSV или .XLS edition Microsoft Office Excel 1 20.07.2010 21:43
Экспорт xls на xml armagedon_atyrau Microsoft Office Excel 9 29.06.2010 15:52
экспорт из xls в xml для excell 2000 zzz007 Microsoft Office Excel 0 20.08.2009 22:47
импорт TXT в XLS(расчет по формулам)-экспорт в XML Zhiltsov Microsoft Office Excel 27 06.07.2009 11:27