C++ 读写 EXCEL

该代码实现了一个ExcelOperate类,用于自动化操作Excel,包括创建和管理Excel应用、工作簿、工作表,以及对单元格的操作,如合并、插入行、设置值等。
摘要由CSDN通过智能技术生成
#include "stdafx.h"
#include "ExcelOperate.h"

ExcelOperate::ExcelOperate()
{
}

ExcelOperate::~ExcelOperate()
{
}

BOOL ExcelOperate::CreateApp()
{
	COleException pe;
	//创建Excel 服务器(启动Excel)
	if (!m_ExcelApp.CreateDispatch(_T("Excel.Application"), &pe))
	{
		AfxMessageBox(_T("启动Excel服务失败,请确保安装了excel 2000或以上版本!"), MB_OK | MB_ICONWARNING);
		pe.ReportError();
		throw& pe;
		return FALSE;
	}
	m_ExcelApp.put_DisplayAlerts(FALSE);//屏蔽警告
	//CString strExcelVersion = m_ExcelApp.get_Version();
	return true;
}

BOOL ExcelOperate::CreateWorkbooks()
{
	if (FALSE == CreateApp())
	{
		return FALSE;
	}
	m_ecBooks.AttachDispatch(m_ExcelApp.get_Workbooks());
	if (!m_ecBooks.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkBooks创建失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	return TRUE;
}

BOOL ExcelOperate::CreateWorkbook()
{
	if (!m_ecBooks.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkBooks为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}

	COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	m_ecBook.AttachDispatch(m_ecBooks.Add(vtMissing));
	if (!m_ecBook.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkBook为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	/*
		//得到document变量
		m_wdDoc = m_wdApp.GetActiveDocument();
		if (!m_wdDoc.m_lpDispatch)
		{
			AfxMessageBox(_T("Document获取失败!"), MB_OK|MB_ICONWARNING);
			return FALSE;
		}
		//得到selection变量
		m_wdSel = m_wdApp.GetSelection();
		if (!m_wdSel.m_lpDispatch)
		{
			AfxMessageBox(_T("Select获取失败!"), MB_OK|MB_ICONWARNING);
			return FALSE;
		}
		//得到Range变量
		m_wdRange = m_wdDoc.Range(vOptional,vOptional);
		if(!m_wdRange.m_lpDispatch)
		{
			AfxMessageBox(_T("Range获取失败!"), MB_OK|MB_ICONWARNING);
			return FALSE;
		}
	*/
	return TRUE;
}

BOOL ExcelOperate::CreateWorksheets()
{
	if (!m_ecBook.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkBook为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecSheets = m_ecBook.get_Sheets();
	if (!m_ecSheets.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheets为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	return TRUE;
}

BOOL ExcelOperate::CreateWorksheet(short index)
{
	if (!m_ecSheets.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheets为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecSheet = m_ecSheets.get_Item(COleVariant(index));
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheet为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//auto name= m_ecSheet.get_Name();
	return TRUE;

	/*打开一个Sheet,如不存在,就新增一个Sheet*/
	//CString strSheetName = _T("NewSheet");
	//try
	//{
	//	/*打开一个已有的Sheet*/
	//	lpDisp = m_ecSheets.get_Item(_variant_t(strSheetName));
	//	m_ecSheet.AttachDispatch(lpDisp);
	//}
	//catch (...)
	//{
	//	/*创建一个新的Sheet*/
	//	lpDisp = m_ecSheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
	//	m_ecSheet.AttachDispatch(lpDisp);
	//	m_ecSheet.put_Name(strSheetName);
	//}
}

BOOL ExcelOperate::CreateSheet(short index)
{
	if (CreateWorksheets() == FALSE)
	{
		return FALSE;
	}
	if (CreateWorksheet(index) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL ExcelOperate::Create(short index)
{
	if (CreateWorkbooks() == FALSE)
	{
		return FALSE;
	}
	if (CreateWorkbook() == FALSE)
	{
		return FALSE;
	}
	if (CreateSheet(index) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

int ExcelOperate::GetSheetCount()
{
	return m_ecSheets.get_Count();
}

BOOL ExcelOperate::LoadSheet(const CString& sheet)
{

	if (!m_ecSheets.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheets为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecSheet = m_ecSheets.get_Item(COleVariant(sheet));
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheet为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//auto name= m_ecSheet.get_Name();
	return TRUE;
}

void ExcelOperate::ShowApp()
{
	m_ExcelApp.put_Visible(true);
	m_ExcelApp.put_DisplayFullScreen(true);//设置全屏显示
	//m_ExcelApp.put_UserControl(FALSE);
}

void ExcelOperate::HideApp()
{
	m_ExcelApp.put_Visible(FALSE);
	//m_ExcelApp.put_CutCopyMode(false);
	//m_ExcelApp.put_UserControl(FALSE);
}

BOOL ExcelOperate::OpenWorkbook(const CString& fileName, short index)
{
	if (!m_ecBooks.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheets为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//COleVariant vFileName(_T(fileName));  
	COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	m_ecBook = m_ecBooks.Open(fileName, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
	if (!m_ecBook.m_lpDispatch)
	{
		AfxMessageBox(_T("WorkSheet获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	if (CreateSheet(index) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL ExcelOperate::Open(const CString& fileName)
{
	if (CreateWorkbooks() == FALSE)
	{
		return FALSE;
	}
	return OpenWorkbook(fileName);
}

BOOL ExcelOperate::SetActiveWorkbook(short& i)
{
	return 0;
}

BOOL ExcelOperate::SaveWorkbook()
{
	if (!m_ecBook.m_lpDispatch)
	{
		//AfxMessageBox(_T("Book获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecBook.Save();
	return TRUE;
}

BOOL ExcelOperate::SaveWorkbookAs(const CString& fileName)
{
	if (!m_ecBook.m_lpDispatch)
	{
		AfxMessageBox(_T("Book获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	COleVariant vFileName(fileName);
	long XlFileFormat = 51;

	CString strSuffix = fileName.Mid(fileName.ReverseFind(_T('.')));

	if (0 == strSuffix.CompareNoCase(_T(".xls")))
	{
		XlFileFormat = 56;
	}
	m_ecBook.SaveAs(
		vFileName,    //VARIANT* FileName  
		_variant_t(XlFileFormat),    //VARIANT* FileFormat  
		vtMissing,    //VARIANT* LockComments  
		vtMissing,    //VARIANT* Password  
		vtMissing,    //VARIANT* AddToRecentFiles  
		vtMissing,    //VARIANT* WritePassword  
		0,    //VARIANT* ReadOnlyRecommended  
		vtMissing,    //VARIANT* EmbedTrueTypeFonts  
		vtMissing,    //VARIANT* SaveNativePictureFormat  
		vtMissing,    //VARIANT* SaveFormsData  
		vtMissing,    //VARIANT* SaveAsAOCELetter  
		vtMissing    //VARIANT* ReadOnlyRecommended  
	);
	return    TRUE;
}

BOOL ExcelOperate::CloseWorkbook()
{
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	m_ecBook.Close(vFalse,    // SaveChanges.  
		vTrue,            // OriginalFormat.  
		vFalse            // RouteDocument.  
	);
	m_ecBook = m_ExcelApp.get_ActiveWorkbook();
	if (!m_ecBook.m_lpDispatch)
	{
		//AfxMessageBox(_T("Book获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	if (CreateSheet(1) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

void ExcelOperate::CloseApp()
{
	SaveWorkbook();
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	//m_ecDoc.Save();  

	if (m_ecRange.m_lpDispatch)
		m_ecRange.ReleaseDispatch();
	if (m_ecSheet.m_lpDispatch)
		m_ecSheet.ReleaseDispatch();
	if (m_ecSheets.m_lpDispatch)
		m_ecSheets.ReleaseDispatch();
	if (m_ecBook.m_lpDispatch)
		m_ecBook.ReleaseDispatch();
	if (m_ecBooks.m_lpDispatch)
		m_ecBooks.ReleaseDispatch();
	m_ExcelApp.Quit();
	if (m_ExcelApp.m_lpDispatch)
		m_ExcelApp.ReleaseDispatch();
}

void ExcelOperate::MergeRange(const CString& begin, const CString& end)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange = m_ecSheet.get_Range(COleVariant(begin), COleVariant(end));

	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange.Merge(_variant_t((long)0));

	//m_ecRange.put_HorizontalAlignment(_variant_t((long)-4108));      //水平居中对齐
	//m_ecRange.put_VerticalAlignment(_variant_t((long)-4108));        //竖直居中对齐
	//m_ecRange.put_ColumnWidth(_variant_t(20));                         //列宽
	//m_ecRange.put_RowHeight(COleVariant(_T("25")));                          //行高

	//ft.AttachDispatch(m_ecRange.get_Font());                            //匹配
	//ft.put_Bold(_variant_t((long)1));           //设置粗体,0-不加粗;1-加粗
	//ft.put_Italic(_variant_t((long)1));         //设置斜体,0-不斜;1-斜
	//ft.put_Size(_variant_t((long)18));                         //字大小
	//ft.put_ColorIndex(_variant_t((long)5));                       //字颜色           
	//it.AttachDispatch(m_ecRange.get_Interior());
	//it.put_ColorIndex(_variant_t((long)8));                            //背景色
	//m_ecRange.BorderAround(_variant_t((long)1), _variant_t((long)2), _variant_t((long)1), vtMissing, vtMissing);//线型            // 线宽              //颜色
}

bool ExcelOperate::InsertRow(const long& row, const long& column)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecRange = m_ecSheet.get_Cells();
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return false;
	}
	
	m_ecRange.AttachDispatch(m_ecRange.get_Item(COleVariant(row), COleVariant(column)).pdispVal, true);

	//CRange cols = m_ecRange.get_EntireColumn();//获取列
	//cols.AutoFit();
	CRange cols = m_ecRange.get_EntireRow();
	cols.Insert(vtMissing, _variant_t(1));//0是复制上面行格式,1是当前行
	cols.ReleaseDispatch();
	return true;
}

void ExcelOperate::SetRangeAndValue(const CString& begin, const CString& end, const CString& value)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange = m_ecSheet.get_Range(COleVariant(begin), COleVariant(end));

	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange.put_Value2(COleVariant(value));	
}

void ExcelOperate::SetRangeAndValue(const long& row, const long& column, const CString& value)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange = m_ecSheet.get_Cells();
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange.put_Item(COleVariant(row), COleVariant(column), COleVariant(value));


	//m_ecRange.AttachDispatch(m_ecSheet.get_UsedRange());//加载已使用的单元格
	//m_ecRange.put_WrapText(_variant_t((long)1));//设置单元格内的文本为自动换行
	//m_ecRange.put_HorizontalAlignment(_variant_t((long)-4108));//水平居中
	//m_ecRange.put_VerticalAlignment(_variant_t((long)-4108));//垂直居中
}

void ExcelOperate::SetRangeAndValue(const long& row, const long& column, const int& value)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange = m_ecSheet.get_Cells();
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return;
	}
	m_ecRange.put_Item(COleVariant(row), COleVariant(column), _variant_t(value));
}

BOOL ExcelOperate::GetRangeAndValue(const CString& begin, const CString& end)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecRange = m_ecSheet.get_Range(COleVariant(begin), COleVariant(end));
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	ret = m_ecRange.get_Value2();//得到表格中的值  
	return TRUE;
}

BOOL ExcelOperate::GetRangeAndValue(const long& row, const long& column)
{
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecRange = m_ecSheet.get_Cells();
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return false;
	}
	//CRange range;
	//range.AttachDispatch(m_ecRange.get_Item(COleVariant(row), COleVariant(column)).pdispVal, true);
	m_ecRange.AttachDispatch(m_ecRange.get_Item(COleVariant(row), COleVariant(column)).pdispVal, true);
	ret = m_ecRange.get_Value2();//得到表格中的值 	
	return TRUE;
}

void ExcelOperate::GetRowsAndCols(long& rows, long& cols)
{
	COleSafeArray sa(ret);
	sa.GetUBound(1, &rows);
	sa.GetUBound(2, &cols);
}

BOOL ExcelOperate::GetTheValue(const int& rows, const int& cols, CString& dest)
{
	/*long rRows, rCols;
	long index[2];
	VARIANT val;
	COleSafeArray sa(ret);
	sa.GetUBound(1, &rRows);
	sa.GetUBound(2, &rCols);
	if (rows < 1 || cols < 1 || rRows < rows || rCols < cols)
	{
		AfxMessageBox(_T("行列不在范围"));
		return FALSE;
	}
	index[0] = rows;
	index[1] = cols;
	sa.GetElement(index, &val);
	if (val.vt != VT_BSTR)
	{
		CString str;
		str.Format(_T("出错点2, %d"), val.vt);
		AfxMessageBox(str);
		return FALSE;
	}
	dest = val.bstrVal;
	return TRUE;*/
	if (!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox(_T("Sheet获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_ecRange = m_ecSheet.get_Cells();
	if (!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return false;
	}
	CRange range;
	range.AttachDispatch(m_ecRange.get_Item(COleVariant((long)rows), COleVariant((long)cols)).pdispVal, true);
	ret = range.get_Value2();

	range.ReleaseDispatch();
	if (ret.vt == VT_BSTR)
	{
		dest = ret.bstrVal;
	}
	//整数
	else if (ret.vt == VT_INT)
	{
		dest.Format(_T("%d"), ret.pintVal);
	}
	//8字节的数字 
	else if (ret.vt == VT_R8)
	{
		dest.Format(_T("%.2lf"), ret.dblVal);
	}
	//时间格式
	else if (ret.vt == VT_DATE)
	{
		SYSTEMTIME st;
		VariantTimeToSystemTime(ret.date, &st);
		CTime tm(st);
		dest = tm.Format(_T("%Y-%m-%d"));

	}
	//单元格空的
	else if (ret.vt == VT_EMPTY)
	{
		dest = "";
	}
	return TRUE;
}

BOOL ExcelOperate::SetTextFormat(const CString& beginS, const CString& endS)
{
	if (GetRangeAndValue(beginS, endS))
	{
		m_ecRange.Select();
		m_ecRange.put_NumberFormatLocal(COleVariant(_T("@")));
		return TRUE;
	}
	return FALSE;
}

BOOL ExcelOperate::SetTextFormat(long& row, long& column)
{
	if (GetRangeAndValue(row, column))
	{
		m_ecRange.Select();
		m_ecRange.put_NumberFormatLocal(COleVariant(_T("@")));
		return TRUE;
	}
	return FALSE;
}

BOOL ExcelOperate::SetRowToTextFormat(const CString& beginS, const CString& endS)
{
	if (GetRangeAndValue(beginS, endS))
	{
		m_ecRange.Select();
		CRange m_tempRange = m_ecSheet.get_Range(COleVariant(beginS), COleVariant(beginS));
		if (!m_tempRange.m_lpDispatch) return FALSE;
		COleVariant vTrue((short)TRUE),
			vFalse((short)FALSE);
		//int tempArray[2] = {1, 2};  
		COleSafeArray saRet;
		DWORD numElements = { 2 };
		saRet.Create(VT_I4, 1, &numElements);
		long index = 0;
		int val = 1;
		saRet.PutElement(&index, &val);
		index++;
		val = 2;
		saRet.PutElement(&index, &val);
		//m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));  
		m_ecRange.TextToColumns(m_tempRange.get_Item(COleVariant((short)1), COleVariant((short)1)), 1, 1, vFalse, vTrue, vFalse, vFalse, vFalse, vFalse, vFalse, saRet, vFalse, vFalse, vTrue);
		m_tempRange.ReleaseDispatch();
		return TRUE;
	}
	return FALSE;
}


#pragma once
#include "msexcel/CApplication0.h"
#include "msexcel/CWorkbook.h"
#include "msexcel/CWorkbooks.h"
#include "msexcel/CWorksheet.h"
#include "msexcel/CWorksheets.h"
#include "msexcel/CRange.h"
#include "msexcel/CFont1.h"
#include "msexcel/Cnterior0.h"

class ExcelOperate
{
public:
	ExcelOperate();

	~ExcelOperate();

	//创建一个新的EXCEL应用程序
	BOOL CreateApp();

	//创建一个新的EXCEL工作簿集合
	BOOL CreateWorkbooks();   

	//创建一个新的EXCEL工作簿
	BOOL CreateWorkbook();   

	//创建一个新的EXCEL工作表集合
	BOOL CreateWorksheets();  

	//创建一个新的EXCEL工作表 
	BOOL CreateWorksheet(short index);  

	BOOL CreateSheet(short index);

	//创建新的EXCEL应用程序并创建一个新工作簿和工作表
	BOOL Create(short index = 1);     

	//得到Sheet的总数
	int GetSheetCount();

	//通过名称使用某个sheet,
	BOOL LoadSheet(const CString& sheet);

	//显示EXCEL文档
	void ShowApp();

	//隐藏EXCEL文档
	void HideApp();

	BOOL OpenWorkbook(const CString& fileName, short index = 1);

	//创建新的EXCEL应用程序并打开一个已经存在的文档。
	BOOL Open(const CString& fileName);          

	//设置当前激活的文档。
	BOOL SetActiveWorkbook(short& i);    

	//Excel是以打开形式,保存。
	BOOL SaveWorkbook();       

	//Excel以创建形式,保存。
	BOOL SaveWorkbookAs(const CString& fileName);  

	/// <summary>
	/// 关闭
	/// </summary>
	/// <returns></returns>
	BOOL CloseWorkbook();
	/// <summary>
	/// 退出
	/// </summary>
	void CloseApp();

	//合并单元格
	void MergeRange(const CString& begin, const CString& end);

	//插入行
	bool InsertRow(const long& row, const long& column);

	//设置值
	void SetRangeAndValue(const CString& begin, const CString& end, const CString& value);
	void SetRangeAndValue(const long& row, const long& column, const CString& value);
	void SetRangeAndValue(const long& row, const long& column, const int& value);

	//得到begin到end的Range并将之间的值设置到ret中 
	BOOL GetRangeAndValue(const CString& begin, const CString& end); 
	BOOL GetRangeAndValue(const long& row, const long& column);

	//得到ret的行,列数 
	void GetRowsAndCols( long& rows,  long& cols);

	//返回第rows,cols列的值,注意只返回文本类型的,到dest中
	BOOL GetTheValue(const int& rows,const int& cols, CString& dest);

	//将beginS到endS设置为文本格式(数字的还要用下面的方法再转一次)
	BOOL SetTextFormat(const CString& beginS, const CString& endS);
	BOOL SetTextFormat(long& row, long& column);

	//将beginS到endS(包括数字类型)设置为文本格式
	BOOL SetRowToTextFormat(const CString& beginS, const CString& endS);

private:
	CApplication0 m_ExcelApp;
	CWorkbooks m_ecBooks;
	CWorkbook m_ecBook;
	CWorksheets m_ecSheets;
	CWorksheet m_ecSheet;
	CRange m_ecRange;
	CFont1 ft;  //定义字体变量
	Cnterior it; //定义背景色变量
	VARIANT ret;//保存单元格的值
	LPDISPATCH lpDisp;
};

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言可以通过使用第三方库或者手动操作文件来实现Excel文件读写。以下是两种方法的介绍: 方法一:使用第三方库 1.1 使用libxls库来读取Excel文件 步骤一:下载libxls库 在http://sourceforge.net/projects/libxls/ 上下载libxls库并解压。 步骤二:安装libxls库 打开命令行窗口,进入解压后的文件夹,执行以下命令: ./configure make sudo make install 步骤三:创建程序文件 创建一个新的C程序文件,例如“excel_read.c”。 步骤四:编写代码 在程序文件中添加以下代码: #include <stdio.h> #include <stdlib.h> #include "libxls/xls.h" int main(int argc, char **argv) { xlsWorkBook* pWB; xlsWorkSheet* pWS; xlsCell* pCell; int i, j; if(argc < 2) { printf("Usage: %s filename.xls\n", argv[0]); return 0; } pWB = xls_open(argv[1], "UTF-8"); if (pWB == NULL) { printf("Error opening file %s\n", argv[1]); return 1; } pWS = xls_getWorkSheet(pWB, 0); if (pWS == NULL) { printf("Error opening worksheet\n"); return 1; } for(i=0; i<=pWS->rows.lastrow; i++) { for(j=0; j<=pWS->rows.lastcol; j++) { pCell = xls_cell(pWS, i, j); if (pCell != NULL && pCell->str != NULL) { printf("%s\t", pCell->str); } else { printf("\t"); } } printf("\n"); } xls_close(pWB); return 0; } 该代码用于读取Excel文件中的数据并输出到控制台。 步骤五:编译和运行程序 在命令行窗口中执行以下命令: gcc -o excel_read excel_read.c -lxlsreader ./excel_read filename.xls 其中,“filename.xls”是要读取Excel文件名。 1.2 使用libxl库来写入Excel文件 步骤一:下载libxl库 在http://www.libxl.com/ 上下载libxl库并解压。 步骤二:安装libxl库 打开命令行窗口,进入解压后的文件夹,执行以下命令: ./configure make sudo make install 步骤三:创建程序文件 创建一个新的C程序文件,例如“excel_write.c”。 步骤四:编写代码 在程序文件中添加以下代码: #include <stdio.h> #include "libxl.h" int main() { BookHandle book = xlCreateBook(); SheetHandle sheet = xlBookAddSheet(book, "Sheet1"); int i, j; for(i=0; i<10; i++) { for(j=0; j<10; j++) { xlSheetWriteNum(sheet, i, j, i*j, 0); } } xlBookSave(book, "output.xls"); xlBookRelease(book); return 0; } 该代码用于创建一个Excel文件并写入一些数据。 步骤五:编译和运行程序 在命令行窗口中执行以下命令: gcc -o excel_write excel_write.c -lxl ./excel_write 程序会将生成的Excel文件保存为“output.xls”。 方法二:手动操作文件 2.1 打开Excel文件 可以使用标准C库中的fopen函数来打开Excel文件,例如: FILE* fp = fopen("filename.xls", "rb"); 其中,“rb”表示以二进制模式打开文件。 2.2 读取Excel文件 可以使用标准C库中的fread函数来读取Excel文件中的数据,例如: char buffer[1024]; int readSize = fread(buffer, 1, sizeof(buffer), fp); 其中,“buffer”是用于存储读取数据的缓冲区,“readSize”是实际读取数据的大小。 2.3 写入Excel文件 可以使用标准C库中的fwrite函数来写入数据到Excel文件,例如: char buffer[] = "Hello, world!"; fwrite(buffer, 1, sizeof(buffer), fp); 其中,“buffer”是要写入的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值