亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cspreadsheet.h

?? DNA分類
?? H
?? 第 1 頁 / 共 3 頁
字號:
// Class to read and write to Excel and text delimited spreadsheet
//
// Created by Yap Chun Wei
// December 2001
// 
// Version 1.1
// Updates: Fix bug in ReadRow() which prevent reading of single column spreadsheet
// Modified by jingzhou xu

#ifndef CSPREADSHEET_H
#define CSPREADSHEET_H

#include <odbcinst.h>
#include <afxdb.h>

class CSpreadSheet
{
public:
	CSpreadSheet(CString File, CString SheetOrSeparator, bool Backup = true); // Open spreadsheet for reading and writing
	~CSpreadSheet(); // Perform some cleanup functions
	bool AddHeaders(CStringArray &FieldNames, bool replace = false); // Add header row to spreadsheet
	bool DeleteSheet(); // Clear text delimited file content
	bool DeleteSheet(CString SheetName); // Clear entire Excel spreadsheet content. The sheet itself is not deleted
	bool AddRow(CStringArray &RowValues, long row = 0, bool replace = false); // Insert or replace a row into spreadsheet. Default is add new row. 
	bool AddCell(CString CellValue, CString column, long row = 0, bool Auto = true); // Replace or add a cell into Excel spreadsheet using header row or column alphabet. Default is add cell into new row. Set Auto to false if want to force column to be used as header name
	bool AddCell(CString CellValue, short column, long row = 0); // Replace or add a cell into spreadsheet using column number. Default is add cell into new row. 
	bool ReplaceRows(CStringArray &NewRowValues, CStringArray &OldRowValues); // Search and replace rows in Excel spreadsheet
	bool ReadRow(CStringArray &RowValues, long row = 0); // Read a row from spreadsheet. Default is read the next row
	bool ReadColumn(CStringArray &ColumnValues, CString column, bool Auto = true); // Read a column from Excel spreadsheet using header row or column alphabet. Set Auto to false if want to force column to be used as header name
	bool ReadColumn(CStringArray &ColumnValues, short column); // Read a column from spreadsheet using column number
	bool ReadCell (CString &CellValue, CString column, long row = 0, bool Auto = true); // Read a cell from Excel spreadsheet using header row or column alphabet. Default is read the next cell in next row. Set Auto to false if want to force column to be used as header name
	bool ReadCell (CString &CellValue, short column, long row = 0); // Read a cell from spreadsheet using column number. Default is read the next cell in next row.
	void BeginTransaction(); // Begin transaction
	bool Commit(); // Save changes to spreadsheet
	bool RollBack(); // Undo changes to spreadsheet
	bool Convert(CString SheetOrSeparator);
	inline void GetFieldNames (CStringArray &FieldNames) {FieldNames.RemoveAll(); FieldNames.Copy(m_aFieldNames);} // Get the header row from spreadsheet
	inline long GetTotalRows() {return m_dTotalRows;} // Get total number of rows in  spreadsheet
	inline short GetTotalColumns() {return m_dTotalColumns;} // Get total number of columns in  spreadsheet
	inline long GetCurrentRow() {return m_dCurrentRow;} // Get the currently selected row in  spreadsheet
	inline bool GetBackupStatus() {return m_bBackup;} // Get status of backup. True if backup is successful, False if spreadsheet is not backup
	inline bool GetTransactionStatus() {return m_bTransaction;} // Get status of Transaction. True if Transaction is started, False if Transaction is not started or has error in starting
	inline CString GetLastError() {return m_sLastError;} // Get last error message

private:
	bool Open(); // Open a text delimited file for reading or writing
	void GetExcelDriver(); // Get the name of the Excel-ODBC driver
	short CalculateColumnNumber(CString column, bool Auto); // Convert Excel column in alphabet into column number

	bool m_bAppend; // Internal flag to denote newly created spreadsheet or previously created spreadsheet
	bool m_bBackup; // Internal flag to denote status of Backup
	bool m_bExcel; // Internal flag to denote whether file is Excel spreadsheet or text delimited spreadsheet
	bool m_bTransaction; // Internal flag to denote status of Transaction

	long m_dCurrentRow; // Index of current row, starting from 1
	long m_dTotalRows; // Total number of rows in spreadsheet
	short m_dTotalColumns; // Total number of columns in Excel spreadsheet. Largest number of columns in text delimited spreadsheet

	CString m_sSql; // SQL statement to open Excel spreadsheet for reading
	CString m_sDsn; // DSN string to open Excel spreadsheet for reading and writing
	CString m_stempSql; // Temporary string for SQL statements or for use by functions
	CString m_stempString; // Temporary string for use by functions
	CString m_sSheetName; // Sheet name of Excel spreadsheet
	CString m_sExcelDriver; // Name of Excel Driver
	CString m_sFile; // Spreadsheet file name
	CString m_sSeparator; // Separator in text delimited spreadsheet
	CString m_sLastError; // Last error message

	CStringArray m_atempArray; // Temporary array for use by functions
	CStringArray m_aFieldNames; // Header row in spreadsheet
	CStringArray m_aRows; // Content of all the rows in spreadsheet

	CDatabase *m_Database; // Database variable for Excel spreadsheet
	CRecordset *m_rSheet; // Recordset for Excel spreadsheet
};

// Open spreadsheet for reading and writing
CSpreadSheet::CSpreadSheet(CString File, CString SheetOrSeparator, bool Backup) :
m_Database(NULL), m_rSheet(NULL), m_sFile(File),
m_dTotalRows(0), m_dTotalColumns(0), m_dCurrentRow(1),
m_bAppend(false), m_bBackup(Backup), m_bTransaction(false)
{
	// Detect whether file is an Excel spreadsheet or a text delimited file
	m_stempString = m_sFile.Right(4);
	m_stempString.MakeLower();
	if (m_stempString == ".xls") // File is an Excel spreadsheet
	{
		m_bExcel = true;
		m_sSheetName = SheetOrSeparator;
		m_sSeparator = ",;.?";
	}
	else // File is a text delimited file
	{
		m_bExcel = false;
		m_sSeparator = SheetOrSeparator;
	}

	if (m_bExcel) // If file is an Excel spreadsheet
	{
		m_Database = new CDatabase;
		GetExcelDriver();
		m_sDsn.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", m_sExcelDriver, m_sFile, m_sFile);

		if (Open())
		{
			if (m_bBackup)
			{
				if ((m_bBackup) && (m_bAppend))
				{
					CString tempSheetName = m_sSheetName;
					m_sSheetName = "CSpreadSheetBackup";
					m_bAppend = false;
					if (!Commit())
					{
						m_bBackup = false;
					}
					m_bAppend = true;
					m_sSheetName = tempSheetName;
					m_dCurrentRow = 1;
				}
			}
		}
	}
	else // if file is a text delimited file
	{
		if (Open())
		{
			if ((m_bBackup) && (m_bAppend))
			{
				m_stempString = m_sFile;
				m_stempSql.Format("%s.bak", m_sFile);
				m_sFile = m_stempSql;
				if (!Commit())
				{
					m_bBackup = false;
				}
				m_sFile = m_stempString;
			}
		}
	}
}

// Perform some cleanup functions
CSpreadSheet::~CSpreadSheet()
{
	if (m_Database != NULL)
	{
		m_Database->Close();
		delete m_Database;
	}
}

// Add header row to spreadsheet
bool CSpreadSheet::AddHeaders(CStringArray &FieldNames, bool replace)
{
	if (m_bAppend) // Append to old Sheet
	{
		if (replace) // Replacing header row rather than adding new columns
		{
			if (!AddRow(FieldNames, 1, true))
			{
				return false;
			}
			else
			{
				return true;
			}
		}

		if (ReadRow(m_atempArray, 1)) // Add new columns
		{
			if (m_bExcel)
			{
				// Check for duplicate header row field
				for (int i = 0; i < FieldNames.GetSize(); i++)
				{
					for (int j = 0; j < m_atempArray.GetSize(); j++)
					{
						if (FieldNames.GetAt(i) == m_atempArray.GetAt(j))
						{
							m_sLastError.Format("Duplicate header row field:%s\n", FieldNames.GetAt(i));
							return false;
						}
					}
				}	
			}

			m_atempArray.Append(FieldNames);
			if (!AddRow(m_atempArray, 1, true))
			{
				m_sLastError = "Problems with adding headers\n";
				return false;
			}

			// Update largest number of columns if necessary
			if (m_atempArray.GetSize() > m_dTotalColumns)
			{
				m_dTotalColumns = m_atempArray.GetSize();
			}
			return true;
		}
		return false;				
	}
	else // New Sheet
	{
		m_dTotalColumns = FieldNames.GetSize();
		if (!AddRow(FieldNames, 1, true))
		{
			return false;
		}
		else
		{
			m_dTotalRows = 1;
			return true;
		}
	}
}

// Clear text delimited file content
bool CSpreadSheet::DeleteSheet()
{
	if (m_bExcel)
	{
		if (DeleteSheet(m_sSheetName))
		{
			return true;
		}
		else
		{
			m_sLastError = "Error deleting sheet\n";
			return false;
		}
	}
	else
	{
		m_aRows.RemoveAll();
		m_aFieldNames.RemoveAll();
		m_dTotalColumns = 0;
		m_dTotalRows = 0;
		if (!m_bTransaction)
		{
			Commit();			
		}
		m_bAppend = false; // Set flag to new sheet
		return true;		
	}
}

// Clear entire Excel spreadsheet content. The sheet itself is not deleted
bool CSpreadSheet::DeleteSheet(CString SheetName)
{
	if (m_bExcel) // If file is an Excel spreadsheet
	{
		// Delete sheet
		m_Database->OpenEx(m_sDsn, CDatabase::noOdbcDialog);
		SheetName = "[" + SheetName + "$A1:IV65536]";
		m_stempSql.Format ("DROP TABLE %s", SheetName);
		try
		{
			m_Database->ExecuteSQL(m_stempSql);
			m_Database->Close();
			m_aRows.RemoveAll();
			m_aFieldNames.RemoveAll();
			m_dTotalColumns = 0;
			m_dTotalRows = 0;
		}
		catch(CDBException *e)
		{
			m_sLastError = e->m_strError;
			m_Database->Close();
			return false;
		}
		return true;
	}
	else // if file is a text delimited file
	{
		return DeleteSheet();
	}
}

// Insert or replace a row into spreadsheet. 
// Default is add new row.
bool CSpreadSheet::AddRow(CStringArray &RowValues, long row, bool replace)
{
	long tempRow;
	
	if (row == 1)
	{
		if (m_bExcel) 
		{
			// Check for duplicate header row field for Excel spreadsheet
			for (int i = 0; i < RowValues.GetSize(); i++)
			{
				for (int j = 0; j < RowValues.GetSize(); j++)
				{
					if ((i != j) && (RowValues.GetAt(i) == RowValues.GetAt(j)))
					{
						m_sLastError.Format("Duplicate header row field:%s\n", RowValues.GetAt(i));
						return false;
					}
				}
			}
			
			// Check for reduced header row columns
			if (RowValues.GetSize() < m_dTotalColumns)
			{
				m_sLastError = "Number of columns in new header row cannot be less than the number of columns in previous header row";
				return false;
			}
			m_dTotalColumns = RowValues.GetSize();
		}

		// Update header row
		m_aFieldNames.RemoveAll();
		m_aFieldNames.Copy(RowValues);
	}
	else
	{
		if (m_bExcel)
		{
			if (m_dTotalColumns == 0)
			{
				m_sLastError = "No header row. Add header row first\n";
				return false;
			}
		}
	}

	if (m_bExcel) // For Excel spreadsheet
	{
		if (RowValues.GetSize() > m_aFieldNames.GetSize())
		{
			m_sLastError = "Number of columns to be added cannot be greater than the number of fields\n";
			return false;
		}
	}
	else // For text delimited spreadsheet
	{
		// Update largest number of columns if necessary
		if (RowValues.GetSize() > m_dTotalColumns)
		{
			m_dTotalColumns = RowValues.GetSize();
		}
	}

	// Convert row values
	m_stempString.Empty();
	for (int i = 0; i < RowValues.GetSize(); i++)
	{
		if (i != RowValues.GetSize()-1) // Not last column
		{
			m_stempSql.Format("\"%s\"%s", RowValues.GetAt(i), m_sSeparator);
			m_stempString += m_stempSql;
		}
		else // Last column
		{
			m_stempSql.Format("\"%s\"", RowValues.GetAt(i));
			m_stempString += m_stempSql;
		}
	}
	
	if (row)
	{
		if (row <= m_dTotalRows) // Not adding new rows
		{
			if (replace) // Replacing row
			{
				m_aRows.SetAt(row-1, m_stempString);
			}
			else // Inserting row
			{
				m_aRows.InsertAt(row-1, m_stempString);
				m_dTotalRows++;
			}

			if (!m_bTransaction)
			{
				Commit();
			}
			return true;
		}
		else // Adding new rows
		{
			// Insert null rows until specified row
			m_dCurrentRow = m_dTotalRows;
			m_stempSql.Empty();
			CString nullString;
			for (int i = 1; i <= m_dTotalColumns; i++)
			{
				if (i != m_dTotalColumns)
				{
					if (m_bExcel)
					{
						nullString.Format("\" \"%s", m_sSeparator);
					}
					else
					{
						nullString.Format("\"\"%s", m_sSeparator);
					}
					m_stempSql += nullString;
				}
				else
				{
					if (m_bExcel)
					{
						m_stempSql += "\" \"";
					}
					else
					{
						m_stempSql += "\"\"";
					}
				}
			}
			for (int j = m_dTotalRows + 1; j < row; j++)
			{
				m_dCurrentRow++;
				m_aRows.Add(m_stempSql);
			}
		}
	}
	else
	{
		tempRow = m_dCurrentRow;
		m_dCurrentRow = m_dTotalRows;
	}

	// Insert new row
	m_dCurrentRow++;
	m_aRows.Add(m_stempString);
	
	if (row > m_dTotalRows)
	{
		m_dTotalRows = row;
	}
	else if (!row)
	{
		m_dTotalRows = m_dCurrentRow;
		m_dCurrentRow = tempRow;
	}
	if (!m_bTransaction)
	{
		Commit();
	}
	return true;
}

// Replace or add a cell into Excel spreadsheet using header row or column alphabet. 
// Default is add cell into new row.
// Set Auto to false if want to force column to be used as header name
bool CSpreadSheet::AddCell(CString CellValue, CString column, long row, bool Auto)
{
	short columnIndex = CalculateColumnNumber(column, Auto);
	if (columnIndex == 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩激情| 国产精品高潮久久久久无| 国产综合色视频| 一区二区三区在线播放| 久久精品一区二区三区av| 欧美天天综合网| 成人免费看的视频| 青青草国产成人av片免费| 亚洲日本在线观看| 久久久三级国产网站| 91精品国产一区二区人妖| 97久久超碰国产精品电影| 国产精品亚洲一区二区三区妖精 | 中文字幕一区在线观看| 欧美一级夜夜爽| 欧美视频一区二区在线观看| 99久久婷婷国产综合精品电影| 极品少妇一区二区| 五月天欧美精品| 亚洲综合成人在线| 成人欧美一区二区三区白人| 久久久噜噜噜久久人人看 | 日韩精品福利网| 亚洲久草在线视频| 中文字幕在线播放不卡一区| 国产日韩精品视频一区| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美日本在线一区| 欧美日韩一区不卡| 欧美性猛片aaaaaaa做受| 色综合久久综合网欧美综合网 | 日韩欧美精品三级| 欧美三级电影网站| 欧美伊人精品成人久久综合97 | 不卡av在线免费观看| 国产91精品精华液一区二区三区| 国模娜娜一区二区三区| 国产一区二区三区久久悠悠色av| 蜜桃免费网站一区二区三区| 麻豆成人久久精品二区三区红| 日本成人在线不卡视频| 美女一区二区视频| 久久精品国产在热久久| 久久国产免费看| 久草精品在线观看| 国产精品911| 不卡一区二区在线| 色哟哟国产精品| 91福利国产成人精品照片| 91福利在线观看| 欧美日本在线播放| 日韩午夜电影在线观看| 精品国产sm最大网站免费看| 久久综合999| 国产精品久久久久永久免费观看| 国产精品久久久久久久久免费桃花 | 精品黑人一区二区三区久久| 精品少妇一区二区三区视频免付费| 精品欧美一区二区久久| 欧美国产日韩亚洲一区| 亚洲欧洲日产国产综合网| 亚洲激情五月婷婷| 日韩精品免费视频人成| 精品一区二区三区影院在线午夜| 国产成人综合在线| 色综合婷婷久久| 欧美日产在线观看| 久久精品亚洲麻豆av一区二区| 国产日产欧产精品推荐色| 国产精品国模大尺度视频| 有码一区二区三区| 青娱乐精品在线视频| 国产成人啪午夜精品网站男同| av综合在线播放| 91精品国产aⅴ一区二区| 国产日韩欧美一区二区三区乱码 | 蜜臀av一区二区在线观看| 国内国产精品久久| 色综合久久久久综合体桃花网| 欧美美女一区二区在线观看| 欧美精品一区二区三区视频| 亚洲欧美另类小说视频| 蜜桃久久av一区| 91亚洲精品一区二区乱码| 91精品国产综合久久精品 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 色综合网站在线| 欧美mv日韩mv国产网站app| 亚洲欧洲国产专区| 久久福利资源站| 一本色道久久综合亚洲91| xvideos.蜜桃一区二区| 亚洲小说欧美激情另类| 福利91精品一区二区三区| 欧洲激情一区二区| 国产日韩欧美电影| 六月丁香综合在线视频| 91麻豆国产福利精品| 久久久一区二区三区捆绑**| 国产一区二区在线观看免费| 91黄色免费版| 欧美国产日韩一二三区| 麻豆一区二区在线| 欧美三级视频在线播放| 国产精品久久久久久久久晋中| 视频一区二区三区在线| 色国产综合视频| 欧美国产日韩精品免费观看| 精品无人区卡一卡二卡三乱码免费卡| 色综合av在线| 欧美国产欧美综合| 韩国成人福利片在线播放| 欧美日韩一区成人| 亚洲精品成人a在线观看| 不卡视频免费播放| 欧美xxx久久| 日本成人中文字幕在线视频| 欧美色区777第一页| 亚洲欧美福利一区二区| 成人深夜视频在线观看| 久久久国产精品不卡| 免费在线观看成人| 欧美日韩久久不卡| 一区二区三区四区中文字幕| 成人黄色777网| 夜夜嗨av一区二区三区| 91在线你懂得| 日本一区二区成人在线| 久久爱www久久做| 精品欧美黑人一区二区三区| 免费人成在线不卡| 日韩欧美国产一区二区在线播放| 天天操天天综合网| 在线电影国产精品| 免播放器亚洲一区| www国产精品av| 国内精品久久久久影院一蜜桃| 欧美videofree性高清杂交| 久久国产综合精品| 欧美成人aa大片| 国产一区二区影院| 国产精品午夜电影| 99精品在线免费| 亚洲黄色性网站| 欧美亚洲一区二区在线| 午夜国产精品一区| 日韩午夜精品电影| 国产精品一二一区| 综合色中文字幕| 欧美亚洲国产一区二区三区| 午夜日韩在线电影| 91精品国产欧美一区二区成人| 日韩1区2区3区| 久久精品综合网| 91一区二区在线| 亚洲成人激情av| 日韩一区二区免费在线观看| 久久99国内精品| 欧美国产一区在线| 在线这里只有精品| 免费av成人在线| 欧美韩国日本综合| 91福利视频在线| 天天亚洲美女在线视频| 久久久亚洲精华液精华液精华液| 成人免费毛片高清视频| 亚洲国产精品人人做人人爽| 337p亚洲精品色噜噜噜| 黑人巨大精品欧美一区| 国产精品灌醉下药二区| 欧美日韩成人综合| 国产在线国偷精品免费看| 亚洲三级免费观看| 91精品国产综合久久久久久| 国产精品18久久久久久久久久久久| 亚洲色图一区二区| 欧美日韩一区高清| 国产精品白丝jk黑袜喷水| 一区二区三区丝袜| 精品久久免费看| 日本黄色一区二区| 韩国三级在线一区| 一区二区欧美精品| 国产三级久久久| 欧美久久久久久久久中文字幕| 国产精品18久久久| 视频在线观看一区二区三区| 国产精品天干天干在观线| 欧美欧美欧美欧美首页| 成人高清视频免费观看| 日本不卡在线视频| 亚洲六月丁香色婷婷综合久久| 日韩欧美电影一区| 欧美专区日韩专区| 国产剧情av麻豆香蕉精品| 日韩av电影天堂| 亚洲免费在线看| 国产精品拍天天在线| 日韩欧美一区在线观看| 在线观看日韩国产|