Viết chương trình truy xuất FILE Excel bằng C (cần gấp)

Liên hệ QC

khacthuyit

Thành viên mới
Tham gia
27/3/09
Bài viết
6
Được thích
0
trên lớp tụi em có bài kiểm tra C, em ko làm được, về tìm tài liệu cũng ko có. MỌi người trên diễn đàn help me làm bài này nha. Bọn em đang họk về TẬP TIN, đề bài là: "Viết chương trình truy xất file EXCEL (đọc và ghi)". Mọi người gắng help me nha!
 
trên lớp tụi em có bài kiểm tra C, em ko làm được, về tìm tài liệu cũng ko có. MỌi người trên diễn đàn help me làm bài này nha. Bọn em đang họk về TẬP TIN, đề bài là: "Viết chương trình truy xất file EXCEL (đọc và ghi)". Mọi người gắng help me nha!

Ít ra thì bạn cũng phải làm phần nào của bài kiểm tra này rồi khi thắc mắc phần nào mới hỏi, mọi người có thể giúp bạn hoàn thiện thêm. Chứ làm cho bạn từ A->Z rồi bạn đi nộp để lấy kết quả thì thật không nên. Thầy của bạn đã dạy bạn những gì quan tới C&Excel thì hãy tận dụng nó. Tôi không nghĩ thày không dạy C&Excel mà lại có bài kiểm tra về nó?

From hai2hai: Nói ké theo Tuân 1 tý (đỡ phải thêm post mới). GPE kiên quyết ko giúp đỡ kiểu "toàn bộ" như thế này. Gần đây có SV hỏi tôi mua sourcecode phần mềm nhân sự để làm đề tài tốt nghiệp. Tôi đã báo giá ...1 tỷ.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ít ra thì bạn cũng phải làm phần nào của bài kiểm tra này rồi khi thắc mắc phần nào mới hỏi, mọi người có thể giúp bạn hoàn thiện thêm. Chứ làm cho bạn từ A->Z rồi bạn đi nộp để lấy kết quả thì thật không nên. Thầy của bạn đã dạy bạn những gì quan tới C&Excel thì hãy tận dụng nó. Tôi không nghĩ thày không dạy C&Excel mà lại có bài kiểm tra về nó?

From hai2hai: Nói ké theo Tuân 1 tý (đỡ phải thêm post mới). GPE kiên quyết ko giúp đỡ kiểu "toàn bộ" như thế này. Gần đây có SV hỏi tôi mua sourcecode phần mềm nhân sự để làm đề tài tốt nghiệp. Tôi đã báo giá ...1 tỷ.
Thầy tụi em đang dạy về tập tin, chưa hề nói tới CÊxcl như anh nói, em muốn mọi người giải thích help em về đề bài này và help e viết đoạn Struch của nó, vì thầy còn phúc vấn nữa nên e cũng phải tụ tìm hiểu một phần để kiến thức là của mình mà...Gắng help e nha
 
viết bằng C khó hơn nhiều khi viết bằng C# vì C không có thư viện hỗ trợ truy cập file excel (*.xls) theo mình nghĩ chắc thầy bạn chỉ yêu cầu bạn viết chương trình bằng C và truy cập vào file excel ghi dưới dạng CSV thôi, bạn nên hỏi lại thầy giáo xem thầy yêu cầu file loại gì
 
Híc, Em chưa biết nhiều về C#, tụi em đang học trên lớp là C++, mà C# và C++ có khác nhau nhiều klo vậy a?
Chưa biết nhiều tức là đã biết. Tôi không biết C++ mà chỉ biết chút ít về C#, cùng họ nhà C với nhau có lẽ cũng không khác nhau nhiều, C++ nằm trong bộ VS6 còn C# tôi thấy có trong bộ VS2005, VS2008. C# là ngôn ngữ mới được cải tiến có sử dụng công nghệ .Net Framework, cung cấp cho ta nhiều phương thức tiện lợi để truy xuất các đối tượng, rút ngắn được nhiều code nhưng ứng dụng lại rất cồng kềnh vì phải cõng thêm bộ .Net, tiêu tốn nhiều tài nguyên hơn.
Nếu như bạn mới bắt đầu thì tôi nghĩ bạn nên chịu khó bắt đầu từ cái cơ bản, khi đã nắm vững cái cơ bản rồi thì việc tiếp cận với những cái cấp cao hơn sẽ dễ hơn. Không nên nóng vội bạn ạ.
 
Định hướng: (Dĩ nhiên ko có cụ thể rồi, việc cụ thể là việc của từng con người)

1. File Ascii dạng *.csv --> Không cần nói tiếp vì ai cũng làm được (Kể cả viết bằng Pascal)
2. File excel (dạng *.xls,...)
2.a: Đọc định dạng file excel (Cái này thì hiếm lắm vì ai mà hiểu được cấu trúc header của loại file này). Tuy nhiên trên PSC đã có duy nhất 1 ví dụ làm theo cách này. Còn dĩ nhiên các hãng 3rd parties cũng phải mua SDK của M$ để có thể đọc được.

2.b: Dùng VS, sử dụng 1 components của 3rd party để mở file excel. Với cách này bạn khỏi phải viết code nhưng lại phải bỏ tiền ra mua components (vcl, ocx, dll, .net components --> Tất cả đều available trên mạng)

2c. Dùng OLE Automation, create Excel Application object và các sub objects (workshet, sheet, range, cell). Dĩ nhiên cách này trên máy đã phải cài MS Excel rồi (vì lúc này MS Excel được gọi là Sever Application)

2d. Nếu file excel bố trí dưới dạng CSDL (ko care đến định dạng format) thì chúng ta truy cập vào file excel như là truy cập vào CSDL. Cách này trên GPE cũng như trên mạng có ... đầy.

Tóm lại, muốn học làm cái gì thì bạn phải hiểu bản chất của sự việc (yêu cầu rõ ràng, phương hướng và cách thức thực hiện, kết quả cần có). Chỉ có cách đó bạn mới giải quyết được nhu cầu của mình (mà ko phụ thuộc vào người khác).

Hope that helps!
 
Vì tụi em chưa biết mà ông thầy cho đề khó hiểu quá! Thầy đi dự hội thảo chưa về nên tụi em ko hỏi được. Em nhờ mấy anh khóa trên, mấy a cũng bó ty luôn. Em nghĩ với mức độ họk trên lớp chắ mục đích Thầy yêu cầu là đọc và ghi dữ liệu thui. Chắc ko liên quan gì đến tính toán hết... Em đã tìm hiểu những gì mọi người gợi ý trên diễn đàn, nhưng vẫn ko tìm ra hướng giải quyết bài toán. E ko biết gì về C#, em chỉ biết về C và C++ thui, sơ cấp thui... Mọi người gắng giúp em nha. Thánk
 
Bạn cài VS6 trong đĩa MSDN có các ví dụ về cách làm việc với đối tượng COM trong C++, trong đó có Excel. Bạn tham khảo ví dụ dưới đây.

Mã:
#include <windows.h>
#include <ole2.h>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
	// global variables

	ifstream in_fp;
	const char* szFileName = argv[1];
	const char* szDictFile = argv[2];
	wchar_t wszFileName[MAX_PATH+1];
	DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};
	VARIANT vResult;	// used to hold variant results
	OLECHAR FAR* szFunction;
	IDispatch* pDispApp;
	IDispatch* pDispXlBooks;
	DISPID dispid_Books; 	//Documents property of application object
	DISPID dispid_Quit;
	BSTR bstrFileName = ::SysAllocString(OLESTR("filename"));
	BSTR bstrPassWord = ::SysAllocString(OLESTR("pass"));

	//get arguements and check files

	if ( argc != 3 ){
		printf("usage %s  \n", argv[0]);
		exit(1);
	}

	in_fp.open(szFileName, ios::in);
	if (!in_fp || strlen(szFileName) > MAX_PATH){
		printf("error loading %s\n", szFileName);
		exit(1);
	}
	in_fp.close();
	in_fp.open(szDictFile, ios::in);
	if (!in_fp){
		printf("error loading %s\n", szDictFile);
		exit(1);
	}

	//convert file name to bstr for use with COM
	MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName)+1,
			wszFileName, sizeof(wszFileName)/sizeof(wszFileName[0]));

	bstrFileName = ::SysAllocString(wszFileName);
	
	// COM work starts here

	//Initialize COM
	::CoInitialize(NULL);
	printf("initializing COM...\n");

	//get the CLSID for the Excel Application Object
	CLSID clsid;
	CLSIDFromProgID(L"Excel.Application", &clsid);

	//get a pointer to the Objects IUnknown interface and Create
	//an instance of the Excel Application.

	IUnknown* pUnk;
	HRESULT hr = ::CoCreateInstance( clsid, NULL,
			CLSCTX_SERVER, IID_IUnknown, (void**) &pUnk);

	printf("instance of Excel Created...\n");

	/*
	   All COM interfaces inherit from the IUnknown interface, this interface
	   has a total of three functions: QueryInterface(), AddRef() and Release()
	   QueryInterface() is used to retrieve a pointer to the IDispatch Interface
	   and the AddRef() and Release() functions are used to maintain the 
	   reference count (a count of all the number of interface pointers that are
	   being used by clients).
	*/

	hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispApp);

	/*
	   use ::GetIDsOfNames on pDisApp to get the DISPID
	   The DISPID (dispatch identifier) uniquely identifies each method within
	   a function.  You then use ::Invoke to call that method or property.
	   when IDispatch::Invoke is called it also passes on parameters for the 
	   method and recieves it's returned value.  This does most of the work.
	*/

	szFunction = OLESTR("Workbooks");
	hr = pDispApp->GetIDsOfNames (IID_NULL, &szFunction, 1,
			LOCALE_USER_DEFAULT, &dispid_Books);

	hr = pDispApp->Invoke (dispid_Books, IID_NULL,
			LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
			&dpNoArgs, &vResult, NULL, NULL);

	pDispXlBooks = vResult.pdispVal;

	//DISPPARAMS for Open method

	DISPID dispid_Open;
	VARIANT vArgsOpen[5];
	DISPPARAMS dpOpen;
	dpOpen.cArgs = 5;
	dpOpen.cNamedArgs = 0;
	dpOpen.rgvarg = vArgsOpen;
	char entry[25];
	wchar_t wszPassWord[25];

	printf("attempting dictionary attack...\n");

	while(in_fp.getline(entry, sizeof(entry))){

		//again convert to bstr
		MultiByteToWideChar(CP_ACP, 0, entry, -1,
				wszPassWord, sizeof(wszPassWord)/sizeof(wszPassWord[0]));

		bstrPassWord = ::SysAllocString(wszPassWord);
		
		vArgsOpen[4].vt = VT_BSTR;
		vArgsOpen[4].bstrVal = bstrFileName;		//Filename
		vArgsOpen[3].vt = VT_ERROR;
		vArgsOpen[3].scode = DISP_E_PARAMNOTFOUND;	//Updatelinks - ommitted
		vArgsOpen[2].vt = VT_BOOL;
		vArgsOpen[2].scode = TRUE;					//Open ReadOnly
		vArgsOpen[1].vt = VT_ERROR;
		vArgsOpen[1].scode = DISP_E_PARAMNOTFOUND;  //file format - ommitted
		vArgsOpen[0].vt = VT_BSTR;
		vArgsOpen[0].bstrVal = bstrPassWord;		//the file password;

		//Invoke the Open method
		szFunction = OLESTR("Open");
		hr = pDispXlBooks->GetIDsOfNames(IID_NULL, &szFunction, 1, 
			                             LOCALE_USER_DEFAULT, &dispid_Open);
		hr = pDispXlBooks->Invoke(dispid_Open, IID_NULL, 
			                      LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
								  &dpOpen, NULL, NULL, NULL);
		printf(".");
		if (!FAILED(hr))
			break;
	}

	if (!FAILED(hr)) // the password was in the dictionary file
		printf("\npassword is %s\n", entry);
	else
		printf("\nthe password was not found\n");
	
	//Invoke the Quit method

    szFunction = OLESTR("Quit");
    hr = pDispApp->GetIDsOfNames(IID_NULL, &szFunction, 1, 
                                 LOCALE_USER_DEFAULT, &dispid_Quit);
    hr = pDispApp->Invoke (dispid_Quit, IID_NULL, 
                           LOCALE_USER_DEFAULT, DISPATCH_METHOD,
                           &dpNoArgs, NULL, NULL, NULL);

	//Clean-up

	::SysFreeString(bstrFileName);
	::SysFreeString(bstrPassWord);

	pDispXlBooks->Release();
	pDispApp->Release();
	pUnk->Release();

	::CoUninitialize();

	return 0;
}

Điều quan trọng bạn phải biết cách sử dụng các METHOD của các lớp giao diện IUnknown, IDispatch như: QueryInterface, GetIDsOfNames, Invoke Các thủ tục trong 2 lớp giao diện này cho phép làm việc với các đối tượng COM.

Bạn cần biết các thành phần của các đối tượng trong Excel như Application, Workbook, Worksheet, Range,... Nếu mới tiếp cận Excel, nên dùng chức năng "Record Macro" để biết các method/property của các đối tượng làm việc như thế nào (thông qua ngôn ngữ VB).
 
Bạn cài VS6 trong đĩa MSDN có các ví dụ về cách làm việc với đối tượng COM trong C++, trong đó có Excel. Bạn tham khảo ví dụ dưới đây.

Điều quan trọng bạn phải biết cách sử dụng các METHOD của các lớp giao diện IUnknown, IDispatch như: QueryInterface, GetIDsOfNames, Invoke Các thủ tục trong 2 lớp giao diện này cho phép làm việc với các đối tượng COM.

Bạn cần biết các thành phần của các đối tượng trong Excel như Application, Workbook, Worksheet, Range,... Nếu mới tiếp cận Excel, nên dùng chức năng "Record Macro" để biết các method/property của các đối tượng làm việc như thế nào (thông qua ngôn ngữ VB).

làm phiền anh Tuấn. e copy và chạy thử, nhưng ko được. E chạy bằng BC31, chạy thử luôn C Free cũng ko được. A chạy bừang chương trình gì vậy? a gthiệu em được ko?

From Sa_DQ:
Bạn chú ý:
(*) Viết tắc phải ghi chú, ví dụ gthiệu (giới thiệu) để dùng lần sau trong bài. Việc này còn nhằm đảm bảo ai cũng đọc được bài viết 1 cách lưu loát; chữ 'ko' này chưa được thông dụng & mình nghĩ cộng đồng sẽ có những người khó chịu khi gặp nó.
Tương tự như vậy với các từ 'e' & 'A'
:-=
 
Chỉnh sửa lần cuối bởi điều hành viên:
làm phiền anh Tuấn. e copy và chạy thử, nhưng ko được. E chạy bằng BC31, chạy thử luôn C Free cũng ko được. A chạy bừang chương trình gì vậy? a gthiệu em được ko?

Tôi chưa chạy thử, mục đích đưa lên để bạn biết hướng giải quyết vấn đề thôi. Bạn hãy tìm hiểu các vấn để tôi nói trên chắc chắn sẽ giải quyết được vấn đề về đọc+ghi dữ liệu với file Excel đang mở.
 
thanks a Tuấn nha! E sẽ tìm hiểu thêm
 
Web KT
Back
Top Bottom