00001
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 ¬e)
00083 {
00084 LNString strTemp;
00085
00086
00087
try {
00088
int nn = 0;
00089
for (
int n=0; n<GetSize(); n++) {
00090
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
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
00260 Add(column);
00261 }
00262
00263
return TRUE;
00264 }