メインページ | ファイル一覧 | ファイルメンバ

ColumnDataArray.cpp

00001 // ColumnDataArray.cpp: CColumnDataArray クラスのインプリメンテーション 00002 // 00004 00005 #include "stdafx.h" 00006 #include "nexpcsv.h" 00007 #include "ColumnDataArray.h" 00008 00009 #ifdef _DEBUG 00010 #undef THIS_FILE 00011 static char THIS_FILE[]=__FILE__; 00012 #define new DEBUG_NEW 00013 #endif 00014 00016 // 構築/消滅 00018 00019 CColumnDataArray::CColumnDataArray() 00020 { 00021 m_szSplit = NULL; 00022 m_nQuote = 0; 00023 m_szAltSplit = NULL; 00024 m_szAltCrlf = NULL; 00025 m_szListSplit = NULL; 00026 m_session = NULL; 00027 } 00028 00029 CColumnDataArray::~CColumnDataArray() 00030 { 00031 00032 } 00033 00034 void CColumnDataArray::Copy(const CColumnDataArray &org) 00035 { 00036 CArray<CColumnData, CColumnData&>::Copy(org); 00037 if (!org.m_strViewName.IsNull()) m_strViewName = org.m_strViewName; 00038 } 00039 00040 void CColumnDataArray::SetView(LNViewFolder &view) 00041 { 00042 if (!view.IsOpen()) view.Open(); 00043 00044 m_strViewName = view.GetName(); 00045 LNINT colsize = view.GetColumnCount(); 00046 for (LNINT n=0; n<colsize; n++) { 00047 LNVFColumn column; 00048 view.GetColumn(n, &column); 00049 CColumnData data; 00050 data.SetColumn(column); 00051 Add( data ); 00052 } 00053 if (view.IsOpen()) view.Close(); 00054 } 00055 00056 void CColumnDataArray::SetOption(const LNNotesSession *session, LPCTSTR szListSplit, LPCTSTR szSplit, const int nQuote, LPCTSTR szAltSplit, LPCTSTR szAltCrlf) 00057 { 00058 m_szSplit = szSplit; 00059 m_nQuote = nQuote; 00060 m_szAltSplit = szAltSplit; 00061 m_szAltCrlf = szAltCrlf; 00062 m_szListSplit = szListSplit; 00063 m_session = session; 00064 } 00065 00066 LNString CColumnDataArray::ToCSVHeader() 00067 { 00068 LNString strTemp; 00069 00070 int nn = 0; 00071 for (int n=0; n<GetSize(); n++) { 00072 CColumnData &column = ElementAt(n); 00073 if (column.IsNull()) continue; 00074 if (!column.IsOutput()) continue; 00075 00076 if (nn++>0) strTemp << m_szSplit; 00077 strTemp << ToCSVText(column.GetTitle(), m_nQuote, m_szSplit, m_szAltSplit, m_szAltCrlf); 00078 } 00079 return strTemp; 00080 } 00081 00082 LNString CColumnDataArray::ToCSVData(LNVFEntry &entry, LNNote &note) 00083 { 00084 LNString strTemp; 00085 00086 // CSV1行の出力 00087 try { 00088 int nn = 0; 00089 for (int n=0; n<GetSize(); n++) { 00090 // CSV1列の出力 00091 CColumnData &column = ElementAt(n); 00092 if (column.IsNull()) continue; 00093 if (!column.IsOutput()) continue; 00094 00095 LNString &strText = LNString(); 00096 if (column.IsViewColumn()) { 00097 strText = column.ToString(entry, m_session, m_szListSplit); 00098 } else if (column.IsFormula()) { 00099 if (!note.IsOpen()) note.Open(LNNOTEOPENFLAGS_DEFAULT | LNNOTEOPENFLAGS_NO_OBJECTS); 00100 strText = column.ToString(note, m_session, m_szListSplit); 00101 } 00102 if (nn++>0) strTemp << m_szSplit; 00103 strTemp << ToCSVText(strText, m_nQuote, m_szSplit, m_szAltSplit, m_szAltCrlf); 00104 } 00105 } catch (LNSTATUS) { 00106 } 00107 if (note.IsOpen()) note.Close(); 00108 return strTemp; 00109 } 00110 00111 LNString CColumnDataArray::ToCSVText(const LNString &strText, int nQuote, LPCTSTR szSplit, LPCTSTR szAltSplit, LPCTSTR szAltCrlf) 00112 { 00113 LPCTSTR szCrlf = _T("\n"); 00114 LPCTSTR szQuote = _T("\""); 00115 LNString strTemp(strText); 00116 00117 // 代替分離記号への置換え 00118 if (szAltSplit != NULL) ReplaceAll(strTemp, szSplit, szAltSplit); 00119 00120 // 代替改行記号への置換え 00121 if (szAltCrlf != NULL) ReplaceAll(strTemp, szCrlf, szAltCrlf); 00122 00123 BOOL bQuote = FALSE; 00124 switch (nQuote) { 00125 case 0: // 囲み記号の処理(自動) 00126 { 00127 LNINT loc; 00128 if ( ( LNWARN_NOT_FOUND != strTemp.Find(szSplit, 0, &loc) ) 00129 || ( LNWARN_NOT_FOUND != strTemp.Find(szCrlf, 0, &loc) ) 00130 || ( LNWARN_NOT_FOUND != strTemp.Find(szQuote, 0, &loc) ) ) { 00131 bQuote = TRUE; 00132 } 00133 break; 00134 } 00135 case 1: // 囲み記号の処理(する) 00136 bQuote = TRUE; 00137 break; 00138 } 00139 00140 // データ内の改行コードを置き換える 00141 ReplaceAll(strTemp, szCrlf, "\x0A"); 00142 00143 // 囲み記号の処理 00144 if (bQuote) { 00145 ReplaceAll(strTemp, szQuote, "\"\""); 00146 strTemp.Insert(0, szQuote); 00147 strTemp.Append(szQuote); 00148 } 00149 00150 return strTemp; 00151 } 00152 00153 #define FILE_VERSION _T("nExpCsv1.5") 00154 #define COLUMNTYPE_VIEWCOLUMN _T("ViewColumn") 00155 #define COLUMNTYPE_FORMULA _T("Formula") 00156 00157 BOOL CColumnDataArray::Save(LPCTSTR szFilepath) 00158 { 00159 LPCTSTR szSplit = _T(","); 00160 00161 int nOutputMode = ios::out | ios::binary; 00162 ofstream fofs(szFilepath, nOutputMode); 00163 if ( !fofs ) return FALSE; 00164 00165 fofs << FILE_VERSION << szSplit; 00166 fofs << (LPCTSTR)ToCSVText(m_strViewName, 0, szSplit, NULL, NULL) << endl; 00167 00168 int nn = 0; 00169 for (int n=0; n<GetSize(); n++) { 00170 // CSV1列の出力 00171 CColumnData &column = ElementAt(n); 00172 if (column.IsNull()) continue; 00173 00174 LNString strTitle = column.GetTitle(); 00175 fofs << (LPCTSTR)ToCSVText(strTitle, 0, szSplit, NULL, NULL) << szSplit; 00176 if (column.IsViewColumn()) { 00177 fofs << COLUMNTYPE_VIEWCOLUMN << szSplit; 00178 fofs << column.GetViewColumnNumber() << szSplit; 00179 } else { 00180 fofs << COLUMNTYPE_FORMULA << szSplit; 00181 LNString strFormula = column.GetFormula(); 00182 fofs << (LPCTSTR)ToCSVText(strFormula, 0, szSplit, NULL, NULL) << szSplit; 00183 } 00184 LPCTSTR szOutput = column.IsOutput() ? _T("TRUE"):_T("FALSE"); 00185 fofs << szOutput << endl; 00186 } 00187 fofs.close(); 00188 return FALSE; 00189 } 00190 00191 BOOL CColumnDataArray::Load(LPCTSTR szFilepath) 00192 { 00193 ifstream ifs(szFilepath); 00194 if ( !ifs ) { 00195 CString strMsg; 00196 strMsg.Format(_T("ファイルを開けませんでした。\nFile=%s"), szFilepath); 00197 AfxMessageBox(strMsg); 00198 return FALSE; 00199 } 00200 00201 CCsvFile csv(ifs); 00202 csv.settrim(); 00203 if (!csv.getline() || stricmp(csv[0], FILE_VERSION) != 0) { 00204 CString strMsg; 00205 strMsg.Format(_T("CSVエクスポート定義ファイルではありません。\nFile=%s"), szFilepath); 00206 AfxMessageBox(strMsg); 00207 return FALSE; 00208 } 00209 00210 BOOL bViewCheck = TRUE; 00211 if ( stricmp(csv[1], m_strViewName) != 0) { 00212 CString strMsg; 00213 strMsg.Format(_T("異なるビュー\"%s\"で保存されたファイルです。\n保存している式の読み込みを継続しますか?"), csv[1]); 00214 int nRet = AfxMessageBox(strMsg, MB_YESNO); 00215 if (nRet == IDNO) return FALSE; 00216 bViewCheck = FALSE; 00217 } 00218 00219 CColumnDataArray arrData; 00220 for (int n=0; n<GetSize(); n++) { 00221 CColumnData &column = ElementAt(n); 00222 if (!column.IsViewColumn()) continue; 00223 LNINT nCol = column.GetViewColumnNumber(); 00224 if (nCol < 0) continue; 00225 arrData.InsertAt(nCol, column); 00226 } 00227 00228 if (bViewCheck) { 00229 RemoveAll(); 00230 } else { 00231 Copy(arrData); 00232 arrData.RemoveAll(); 00233 } 00234 00235 while (csv.getline()) 00236 { 00237 CColumnData column; 00238 column.SetTitle(csv[0]); 00239 if (bViewCheck && stricmp(csv[1], COLUMNTYPE_VIEWCOLUMN) == 0) { 00240 int n = atoi(csv[2]); 00241 if (n < arrData.GetSize() && arrData[n].IsViewColumn()) { 00242 column = arrData[n]; 00243 arrData[n] = CColumnData(); // クリア 00244 } 00245 } else if (stricmp(csv[1], COLUMNTYPE_FORMULA) == 0) { 00246 try { 00247 column.SetColumn(csv[2]); 00248 } catch (LNSTATUS) { 00249 } 00250 } 00251 if (!column.IsNull()) Add(column); 00252 } 00253 ifs.close(); 00254 00255 // 利用されなかったビュー列情報を追加 00256 for ( n=0; n<arrData.GetSize(); n++) { 00257 CColumnData &column = arrData.ElementAt(n); 00258 if (!column.IsViewColumn()) continue; 00259 // column.SetOutput(FALSE); 00260 Add(column); 00261 } 00262 00263 return TRUE; 00264 }

LotusNotes CSV Export Plug-inに対してWed Jun 30 15:53:52 2004に生成されました。 doxygen 1.3.7